jtahstu的博客

root@jtahstu.com   Github   英文博客  

最新碎语:以后没事写写小的知识点吧

您的位置:jtahstu的博客 >笔记> AC自动机四之抓取南阳OJ的AC代码

AC自动机四之抓取南阳OJ的AC代码

<?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中国大陆许可协议 进行许可,欢迎转载,演绎或用于商业目的。

---

二维码加载中...

扫一扫移动端访问O(∩_∩)O

发表评论

70 + 57 =
路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交
正在加载中……