认真的人才讨别人喜欢

phpQuery采集页面内容的探索
发表于2017-12-29 09:32:11 | 分类:技术 | 阅读:102

想用PHP来学习爬虫,搜来搜去的教程大多都不管用,最后找到了phpQuery。


phpQuery采用了jQuery的思想是最吸引我的地方,这使得我可以像使用jQuery一样去查找文档节点,并处理其页面内容,获得我想要的数据,我只想说:熟悉的代码风格无敌!


简单举例:获得[大锅博客]的所有文章标题。


   <?php
       include 'phpQuery.php';
       phpQuery::newDocumentFile('https://www.chenweiqiang.com');
       $list=pq("h3");
       foreach ($list as $li) {
	  echo pq($li)->html()."<br/><br/>";
       }
   ?>


第一行:引入 phpQuery.php 的单文件(官网还有完整版);


第二行:通过 phpQuery::newDocumentFile 加载文档,参数就是要采集内容的页面url;


第三行:使用 pq() 函数来指定节点,返回的结果是一个对象,等价于 jQuery 中的 $ 。二者用法基本一致,只需要注意对返回的对象的操作是 pq( )-> 与 $( ). 的区别。


第四行:使用熟悉的 html() 循环输出对象的内容,当然也可以使用 text() 来输出文本内容。


TIM图片20171228165302.png


如果我们想获得这些文章的链接:


1.可以在第三行代码中直接精确到pq("h3 a"),然后输出pq($li)->attr("href")。


2.也可以利用find方法这样输出pq($li)->find("a")->attr("href")。


phpQuery的选择器与过滤器和方法,都与jQuery相似。



测试中的问题:


1.如果采集的网页是https开头的,需要在php.ini中删掉 ;extension=php_openssl.dll 之前的 ; ,开启参数。(然后反正我重启了apache)


2.图片获得相对链接,可能无法正常显示。


3.关于乱码问题:phpQuery在认不清网页的编码,即找不到meta属性时,文件会默认转换成 ISO-8859-1 的格式,这与 utf-8 的输出格式不同,所以产生乱码。可以使用 mb_convert_encoding($text,'ISO-8859-1','utf-8') 转换格式,就能正确输出内容。



但是,在尝试采集《糗事百科》的糗事时,发现大部分内容都是正确的,部分是乱码。


a.如果是全部输出文件进行格式转换,又会使正确的内容变成乱码。


b.确认糗事详情页面的结构应该是一样的情况下,发现出现乱码的页面已经在头部标明编码为utf-8,但是文字在页面的中段开始变成乱码,没有办法单独找出有乱码的页面来转换格式。(可能是phpQuery单文件的年代过久远,版本比较落后。)


c.最后为了区分出有乱码的内容,使用了最傻的方法,匹配部分常见的乱码字符,如果为真就进行格式转换。



最后:利用phpQuery采集本博客的内容时十分精确,可能是博客的页面结构比较简洁的原因,采集部分网站内容时会产生定位不准确,数据多余杂乱的现象。



附上


1.phpQuery单文件.zip


2.获取此时 糗事百科 文字分类的第一条糗事


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
点击此处,取消分享
*以下内容皆为必填项目

0条评论

暂无评论
TOP