<?php header("Content-type: text/html; charset=utf-8"); function getAcCode($pid) { // 初始化一个 cURL 对象 $curl = curl_init(); // 设置你需要抓取的URL curl_setopt($curl, CURLOPT_URL, "http://accepted.com.cn/nyist$pid/"); // 设置header curl_setopt($curl, CURLOPT_HEADER, 1); // 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_REFERER, 'Connection: keep-alive'); curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8')); //IP curl_setopt($curl, CURLOPT_REFERER, "http://accepted.com.cn/luogu2137/"); //来路 // 运行cURL,请求网页 $data = curl_exec($curl); // 关闭URL请求 curl_close($curl); $divStart = strrpos($data, "<textarea wrap=\"soft\""); if (!$divStart) return FALSE; $divEnd = strpos($data, "\">", $divStart); $codeStart = $divEnd + 2; $codeEnd = strpos($data, "</textarea>", $codeStart); $code = substr($data, $codeStart, $codeEnd - $codeStart); return html_entity_decode($code); } function saveAcCode($pid, $code) { $dbms = 'mysql'; $host = 'localhost'; //数据库主机名 $dbname = 'application'; //使用的数据库 $user = 'jtahstu'; //数据库连接用户名 $pass = 'jtahstu'; //对应的密码 $dsn = "$dbms:host=$host;dbname=$dbname"; try { $dbh = new PDO($dsn, $user, $pass); $dbh -> exec("set names utf8"); $stmt = $dbh -> prepare("insert into nyojAcCode values(?,?);"); $stmt -> bindParam(1, $pid); $stmt -> bindParam(2, $code); $res = $stmt -> execute(); return $res; } catch (PDOException $e) { die("Error!: " . $e -> getMessage() . "<br/>"); } } // echo "<pre>".htmlentities(getAcCode(1205))."</pre>"; for ($i = 1; $i <= 1243; $i++) { $code = getAcCode($i); if (!$code) continue; $rec = saveAcCode($i, $code); if ($rec) { echo $i . "ok<br>"; } sleep(5); } ?>
抓代码的时候是真的坑,他这个网站放在新浪云上面的,爬的时候经常触发防火墙,返回609错误,不给访问,所以抓的时候经常出现中断,来回搞了好长时间,然后存入数据库,代码简单。
---
本文章采用 知识共享署名2.5中国大陆许可协议 进行许可,转载必须注明作者和本文链接。
---
发表评论