惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
博客园_首页
Vercel News
Vercel News
WordPress大学
WordPress大学
美团技术团队
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Y
Y Combinator Blog
博客园 - 【当耐特】
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
腾讯CDC
M
MIT News - Artificial intelligence
爱范儿
爱范儿
Recent Announcements
Recent Announcements
雷峰网
雷峰网
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
The Register - Security
The Register - Security
Jina AI
Jina AI
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Hugging Face - Blog
Hugging Face - Blog
P
Privacy & Cybersecurity Law Blog
Recorded Future
Recorded Future
Help Net Security
Help Net Security
N
News and Events Feed by Topic
博客园 - Franky
P
Proofpoint News Feed
L
LINUX DO - 热门话题
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
D
Docker
Google DeepMind News
Google DeepMind News
有赞技术团队
有赞技术团队
IT之家
IT之家
Security Latest
Security Latest
L
LangChain Blog
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
J
Java Code Geeks

文章列表 - 她和她的猫

使用小鹤双拼一个月 折腾 Hugo PaperMod 主题 去长鹿旅游休博园 1Password 自动化登录堡垒机 深入 Hyperf:Inject 注解是如何工作的? 译|理解容器镜像层 使用 Rust 实现高性能预写日志(Write Ahead Log) 译|使用 Linux 命名空间隔离系统 深入 Hyperf:HTTP 服务是如何处理请求的? Linux 文件权限学习笔记 译|了解 Bitcask:基于日志结构的 KV 存储引擎 还原 SM2 压缩公钥的几种方法 深入 Hyperf:HTTP 服务启动时发生了什么? 一次 Hyperf 注解失效问题分析 将博客迁移到又拍云 译|PHP 7 新的 Hashtable 实现 排查 ES 查询问题:深入了解 json_encode() 函数 浅析 Redlock 分布式锁实现原理 Yar 源码阅读笔记:RPC 服务端 Yar 源码阅读笔记:客户端的并行调用 Yar 源码阅读笔记:客户端的同步调用 Yar 源码阅读笔记:数据传输模块 Yar 源码阅读笔记:消息编码模块 Yar 源码阅读笔记:RPC 通信协议 Yar 源码阅读笔记:开篇 PHP 8 新特性介绍 基于 OpenSSL 实现国密 SM4 加解密 PHP 源码阅读笔记:编译与调试 PHP 什么是惊群问题 大端模式和小端模式 基于 GitHub Actions 定时推送网址到百度站长平台 聊聊五种 I/O 模型 Workerman 源码分析:文件上传 浅入浅出 HTTP 协议 PHP 网络编程:构建 MySQL 蜜罐获取攻击者微信 ID 使用 Workerman 接入 Bilibili 直播弹幕协议 使用 GitHub Actions 自动部署 Hexo 什么是二进制安全 【转载】PHP 程序员进阶之路 优化 Workerman 检查主进程是否存活的逻辑 基于 Redis 实现分布式锁 《PHP 实现 Base64 编码/解码》笔记 PHP 多进程下载必应壁纸 基于 Redis 实现延迟队列 【转载】PHP 实现 Base64 编码/解码 使用 MySQL FIELD() 函数自定义排序规则 Laravel 的 Facades 实现原理 C语言单链表实现约瑟夫环 数据结构学习笔记:顺序栈和链栈(C语言) 使用 QueryList + Redis 下载壁纸 在 Laravel 登录/注册中使用 mews/captcha 扩展包 使用 mews/captcha 扩展包为 Laravel 应用添加图片验证码 给 YOURLS 短网址系统编写插件《批量生成短网址》 给 YOURLS 短网址系统编写插件《Hello World!》 PHP 7.1 使用 json_encode 函数造成浮点类型数据出现精度问题 Laravel 授权策略(Policy)的基本使用 Ubuntu 系统下 WiFi 频繁掉线解决方法 Laravel 应用部署到 Nginx 服务器上的第一个坑 Ubuntu 16.04 LST 安装 Redis 和 Composer Nginx 环境 SSL 强制 HTTP 301 跳转到 HTTPS 【工作&生活】第一周 ServiceStack.Redis 与多线程 Count the number of Duplicates C# Base64 加密及解密 ASP.NET MVC 使用动态类型传递数据 Django 使用 order_by() 对数据进行排序操作 ASP.NET + jQuery + AJAX 实现用户登录 ASP.NET 从客户端中检测到有潜在危险的 Request.Form 值 ASP.NET 使用 FormData 实现 AJAX 上传图片 Python 使用 BeautifulSoup 抓取网页 贪心算法之字符串的完美度 一言不和就造轮子之 CookieHelper ASP.NET 上传图片 DBHelper 类 C# 捕获屏幕源码 用 JavaScript 做一些有趣的事情 第一篇文章 好久不见。 如何防止非法调用 PHP 文件 清明小记。 PHP 生成随机字符串 Z-Blog PHP 程序做 301 跳转 PHP 处理数组常用的几个函数 Sublime Text 3 快捷键总结 PHP 使用 file_get_contents() 函数实现采集网页 使用 C# 编写学生信息管理系统 终于到了。 zblog报错: magic_quotes_gpc 和 safe_mode 世事无常。 如何使用 PHP 上传文件 安卓手机编写和运行 PHP 程序的软件 使用 AJAX 刷新、验证 PHP 图片验证码 PHP 生成图片验证码 PHP 之 session 的使用方法 PHP 之 cookie 的使用方法 PHP 实现分页原理详解 Thinkphp 框架中系统常量在 Js 文件中不解析的解决方法
PHP 采集逐浪小说章节列表
她和她的猫 · 2017-08-02 · via 文章列表 - 她和她的猫

距离上一次写采集教程已经是一年前了,而我已经实习快一个月了,不得不感叹时间过得真快,岁月催人老啊….

先品尝一下《PHP使用file_get_contents()函数实现采集网页》,食用更佳哦。

第一步,获取页面的html

首先,要获取该页面的html内容,随便打开一个小说章节目录的地址,例如 http://book.zhulang.com/427458/。可以使用 curl,也可以使用 file_get_contents() 函数,因为不用模拟请求头等操作,我就直接用第二种方式。

获取到 HTML 后要进行过滤,将一些换行符、空格进行过滤,使得 HTML 比较干净。

$content = file_get_contents('http://book.zhulang.com/427458/');
$content=str_replace("\n",'',$content);
$content=str_replace("\r",'',$content);
$content=str_replace("\r\n",'',$content);
$content=str_replace(" ",'',$content);

第二步,分析页面

拿到 HTML 内容后,使用 preg_match_all() 函数将章节目录的html块提取出来,缩小了匹配范围,也减少了出现错误数据的可能性。

preg_match_all('/<divclass=\"chapter-list\">(.*)<\/div>/', $content, $chapterHtml);
$chapterHtml = $chapterHtml[1][0];

preg_match_all() 函数第一个参数是正则表达式,第二个参数是需要匹配的内容,第三个参数是储存匹配结果的数组,$chapterHtml[0] 包含整个模式匹配的文本,$chapterHtml[1] 是包含第一个括号(正则表达式(http://book.zhulang.com/\d+/\d+.html))中所匹配的文本,$chapterHtml[2] 就是第二个括号,以此类推。

第三步,提取数据

这一步就是观察章节地址的格式,举个例子:

http://book.zhulang.com/427458/152725.html

格式:

http://book.zhulang.com/数字/数字.html

然后编写正则表达式:

/(http:\/\/book\.zhulang\.com\/\d+\/\d+\.html)/

这样章节地址就出来了,然后编写匹配标题的表达式:

/\"title=\"[\W|\d]+\">(.*?)<\/a>

最后合在一起,并打印:

preg_match_all('/(http:\/\/book\.zhulang\.com\/\d+\/\d+\.html)\"title=\"[\W|\d]+\">(.*?)<\/a>/', $chapterHtml, $result);
var_dump($result);

得到如下结果:

array (size=3)
  0 => 
    array (size=72)
      0 => string 'http://book.zhulang.com/427458/46802.html"title="第一章捕鱼2017-06-3014:47">第一章捕鱼</a>' (length=100)
      1 => string 'http://book.zhulang.com/427458/46803.html"title="第二章神女梦2017-06-3014:48">第二章神女梦</a>' (length=106)
      2 => string 'http://book.zhulang.com/427458/46805.html"title="第三章绿液2017-06-3014:48">第三章绿液</a>' (length=100)
      3 => string 'http://book.zhulang.com/427458/46807.html"title="第四章卖参2017-06-3014:49">第四章卖参</a>' (length=100)
      ......
  1 => 
    array (size=72)
      0 => string '46802' (length=5)
      1 => string '46803' (length=5)
      2 => string '46805' (length=5)
      3 => string '46807' (length=5)
       ......
  2 => 
    array (size=72)
      0 => string '第一章捕鱼' (length=15)
      1 => string '第二章神女梦' (length=18)
      2 => string '第三章绿液' (length=15)
      3 => string '第四章卖参' (length=15)
      ......

还是跟上面一样,$result[0] 是包含整个模式匹配的文本,$result[1] 就是第一个括号((http://book.zhulang.com/\d+/\d+.html))匹配出来的章节地址的数组,$result[1] 就是第二个括号((.*?))匹配出来的章节标题的数组。完整代码:

$content = file_get_contents('http://book.zhulang.com/427458/');
$content=str_replace("\n",'',$content);
$content=str_replace("\r",'',$content);
$content=str_replace("\r\n",'',$content);
$content=str_replace(" ",'',$content);
preg_match_all('/<divclass=\"chapter-list\">(.*)<\/div>/', $content, $chapterHtml);
$chapterHtml = $chapterHtml[1][0];
preg_match_all('/(http:\/\/book\.zhulang\.com\/\d+\/\d+\.html)\"title=\"[\W|\d]+\">(.*?)<\/a>/', $chapterHtml, $result);
for ($i = 0; $i < count($result[0]); $i++)
{
    echo '标题:' . $result[2][$i] . ' ---- URL地址:' . $result[1][$i] . '<br>';
}

写在最后

这里只讲了如何获取章节地址及标题,小说列表、小说正文的采集的方法其实都差不多,主要还是观察 div 结构,然后再编写正则表达式。

这是一篇过去很久的文章,其中的信息可能已经有所发展或是发生改变。