0

0

使用curl和正则表达式抓取网页数据

php中文网

php中文网

发布时间:2016-07-25 08:48:28

|

1633人浏览过

|

来源于php中文网

原创

利用curl和正则表达式做的一个针对磨铁中文网非vip章节的小说抓取器,支持输入小说ID下载小说。
依赖项:curl
可以简单的看下,里面用到了curl ,正则表达式,ajax等技术,适合新手看看。在本地测试,必须保证联网并且确保php开启curl的mode.
  1. session_start();
  2. //封装成类 开启这些自动抓取文章
  3. #header("Refresh:30;http://www.test.com:8080");
  4. class SpiderTools{
  5. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  6. /*传入文章ID 解析出文章标题*/
  7. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  8. public function getBookNameById($aid){
  9. //初始化curl
  10. $ch= curl_init();
  11. //url
  12. $url='http://www.motie.com/book/'.$aid;
  13. if(is_numeric($aid)){
  14. //正则表达式匹配
  15. $ru="/

    \s*(.*)\s*\s*/";

  16. }
  17. else{
  18. //丧尸爆发之全家求生路_第一章 丧尸爆发  为吾友爱乐儿更新~_磨铁
  19. $ru="/(.*)/";
  20. }
  21. //设置选项,包括URL
  22. curl_setopt($ch, CURLOPT_URL, $url);
  23. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容
  24. curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息
  25. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0);
  26. //执行curl
  27. $output = curl_exec($ch);
  28. //错误提示
  29. if(curl_exec($ch) === false){
  30. die(curl_error($ch));
  31. }
  32. // 检查是否有错误发生
  33. if(curl_errno($ch)){
  34. echo 'Curl error: ' . curl_error($ch);
  35. }
  36. //释放curl句柄
  37. curl_close($ch);
  38. $arr=array();
  39. preg_match_all($ru,$output,$arr);
  40. return $arr[1][0];
  41. }
  42. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  43. /*传入文章ID 解析文章内容*/
  44. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  45. public function getBookContextById($aid){
  46. //开始解析文章
  47. $ids=array();
  48. $ids=explode("_",$aid);
  49. $titleId=trim($ids[0]);
  50. $aticleId=trim($ids[1]);
  51. $ch= curl_init();
  52. $ru="/
    [\s\S]*
    [\s\S]*(.*)<img  src="%5C%22%5C/ajax%5C/chapter%5C/%24titleId%5C/%24aticleId%5C%22" class='\"hidden\"' alt="使用curl和正则表达式抓取网页数据 " >/ui";	
  53. $url='http://www.motie.com/book/'.$aid;
  54. //正则表达式匹配
  55. //设置选项,包括URL
  56. curl_setopt($ch, CURLOPT_URL, $url);
  57. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容
  58. curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息
  59. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0);
  60. //执行curl
  61. $output = curl_exec($ch);
  62. //错误提示
  63. if(curl_exec($ch) === false){
  64. die(curl_error($ch));
  65. }
  66. // 检查是否有错误发生
  67. if(curl_errno($ch)){
  68. echo 'Curl error: ' . curl_error($ch);
  69. }
  70. $arr=array();
  71. $arr2=array();
  72. preg_match_all($ru,$output,$arr);
  73. curl_close($ch);
  74. #var_dump($arr);
  75. $s=$arr[0][0];
  76. $s=substr($s,180);
  77. $arr2=explode("使用curl和正则表达式抓取网页数据
  78. return trim($arr2[0]);
  79. }
  80. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  81. /*静态方法 @生成小说文件 可以直接调用 */
  82. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  83. public static function createBookById($id){
  84. if(!is_numeric($id)){
  85. echo "
    INIT BEGIN START WRITE!";
  86. $st=new self();
  87. $cons=$st->getBookContextById($id);
  88. $title=$st->getBookNameById($id);
  89. $cons=trim($cons);
  90. $t=explode(" ",$title);
  91. //构造目录
  92. $dir=array();
  93. $dir=explode("_",$t[0]);
  94. $wzdir=$dir[0]; //书名称 作为目录名称
  95. $wzchapter=$dir[1]; //第几章
  96. //创建目录
  97. $wzdir2=iconv("UTF-8", "GBK", $wzdir);//目录编码 注意这里保留对$wzdir字符串的引用,用来构造文件名,不能用此处,防止二次编码
  98. if(!file_exists($wzdir2)){
  99. mkdir($wzdir2); //创建目录
  100. }
  101. //构造文件名
  102. $wztitle="./".$wzdir."/"."$t[0]".".txt";
  103. //保证保存的文件名称不是乱码
  104. $wztitle=iconv("UTF-8", "GBK", $wztitle);
  105. $f=fopen($wztitle,"w+");
  106. fwrite($f,$cons);
  107. echo "$wzdir ".$wzchapter."写入成功";
  108. fclose($f);
  109. }
  110. else{
  111. $ids=self::getBookIdsById($id);
  112. //这里服务器可能会掉线,所以最好用session记录循环
  113. #for($i=$_SESSION["$id"."_fid"];$i
  114. #self::createBookById($id."_".$ids[$_SESSION["$id"."_fid"]++]);//构造id
  115. #}
  116. for($i=$_SESSION["$id"."_fid"];$i
  117. self::createBookById($id."_".$ids[$i]);//构造id
  118. }
  119. #echo "


    写入工作全部完成

    ";
  120. #echo $id."_".$ids[0]."
    ";
  121. #var_dump($ids);
  122. }
  123. }
  124. /*
  125. 获取小说的所有ID
  126. @param $id 文章ID
  127. @return array;
  128. */
  129. public static function getBookIdsById($aid){
  130. $ch= curl_init();
  131. $url='http://www.motie.com/book/'.$aid."/chapter";
  132. //注意这里的?可以获取最少匹配项
  133. $ru='/[\s\S]*?
  134. [\s\S]*?.*?.*?/u';//正则表达式匹配
  135. //设置选项,包括URL
  136. curl_setopt($ch, CURLOPT_URL, $url);
  137. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容
  138. curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息
  139. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0);
  140. //执行curl
  141. $output = curl_exec($ch);
  142. // 检查是否有错误发生
  143. if(curl_errno($ch)){
  144. echo 'Curl error: ' . curl_error($ch);
  145. }
  146. //释放curl句柄
  147. curl_close($ch);
  148. $arr=array();
  149. preg_match_all($ru,$output,$arr,PREG_PATTERN_ORDER);
  150. return $arr[1];
  151. }
  152. }
  153. ?>
复制代码
  1. session_start();
  2. require_once("SpiderTools.class.php");
  3. if($_REQUEST["bid"]){
  4. if(is_numeric($_REQUEST["bid"])){
  5. SpiderTools::createBookById(trim($_REQUEST["bid"]));
  6. }
  7. else{
  8. echo "
    请输入正确的文章ID
    ";
  9. }
  10. }
  11. ?>
复制代码
  1. 下载小说啦
  2. 输入磨铁中文网你想看到的小说ID号就可以下载小说啦

  • <script language="javascript"></script>
  • var xmlHttp;
  • function createbook()
  • {
  • xmlHttp=GetXmlHttpObject()
  • if (xmlHttp==null)
  • {
  • alert ("浏览器不支持ajax")
  • return
  • }
  • var bookid=document.getElementById("myid").value
  • var url="getinfo.php"
  • url=url+"?bid="+bookid;
  • url=url+"&sid="+Math.random()
  • xmlHttp.onreadystatechange=stateChanged
  • xmlHttp.open("GET",url,true)
  • xmlHttp.send(null)
  • }
  • function stateChanged()
  • {
  • if(xmlHttp.readyState==1){
  • document.getElementById("info").innerHTML="正在准备工作,请耐心点哦~^_^~使用curl和正则表达式抓取网页数据
    ";
  • }
  • if(xmlHttp.readyState==2){
  • document.getElementById("info").innerHTML="正在联系服务器,这可能需要一点时间啦^>使用curl和正则表达式抓取网页数据 ";
  • }
  • if(xmlHttp.readyState==3){
  • document.getElementById("info").innerHTML="正在解析数据使用curl和正则表达式抓取网页数据
    ";
  • }
  • if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
  • {
  • document.getElementById("info").innerHTML=xmlHttp.responseText;
  • //xmlHttp.abort();
  • }
  • }
  • function GetXmlHttpObject()
  • {
  • var xmlHttp=null;
  • try
  • {
  • // Firefox, Opera 8.0+, Safari
  • xmlHttp=new XMLHttpRequest();
  • }
  • catch (e)
  • {
  • //Internet Explorer
  • try
  • {
  • xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
  • }
  • catch (e)
  • {
  • xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
  • }
  • }
  • return xmlHttp;
  • }
  • 复制代码


    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
    pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

    本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

    463

    2026.02.13

    微博网页版主页入口与登录指南_官方网页端快速访问方法
    微博网页版主页入口与登录指南_官方网页端快速访问方法

    本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

    135

    2026.02.13

    Flutter跨平台开发与状态管理实战
    Flutter跨平台开发与状态管理实战

    本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

    64

    2026.02.13

    TypeScript工程化开发与Vite构建优化实践
    TypeScript工程化开发与Vite构建优化实践

    本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

    20

    2026.02.13

    Redis高可用架构与分布式缓存实战
    Redis高可用架构与分布式缓存实战

    本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

    26

    2026.02.13

    c语言 数据类型
    c语言 数据类型

    本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

    29

    2026.02.12

    雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
    雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

    本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

    14

    2026.02.12

    豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
    豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

    本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

    524

    2026.02.12

    PostgreSQL性能优化与索引调优实战
    PostgreSQL性能优化与索引调优实战

    本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

    53

    2026.02.12

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Swoft2.x速学之http api篇课程
    Swoft2.x速学之http api篇课程

    共16课时 | 1万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号