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

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

第一步,获取页面的html

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

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

1
2
3
4
5
$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块提取出来,缩小了匹配范围,也减少了出现错误数据的可能性。

1
2
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] 就是第二个括号,以此类推。

第三步,提取数据

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

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

格式:

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

然后编写正则表达式:

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

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

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

最后合在一起,并打印:

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

得到如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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] 就是第二个括号((.*?))匹配出来的章节标题的数组。完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
$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 结构,然后再编写正则表达式。

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