php爬虫实践
之前用nodejs的cheerio来做,不过nodejs的异步回掉太恶心了,受不了。
后来发现了php的htmlpagedom库,类似jquery的选择器语法,而且支持中文。
安装 composer install wa72/htmlpagedom
1、读取一个简单的网页,如:
require 'vendor/autoload.php'; use \Wa72\HtmlPageDom\HtmlPageCrawler; $url = "http://news.cnblogs.com/"; $dom = HtmlPageCrawler::create(file_get_contents($url)); print $dom->text(); //输出内容
2、如何分析,使用jquery选择器语法,可以参考
如提取博客园新闻首页第一页的所有链接,结构如下

$news_list = $dom->filter("#news_list");
$news_entry =$news_list->filter(".news_entry");
$urls = [];
$i = 0;
$url_cnt = $news_entry->count();
//print $url_cnt; 30条,在浏览器里查找“发布于”是30,证明是正确的
while ($i<$url_cnt){
$urls[] = $news_entry->eq($i)->filter('a')->eq(0)->attr("href");
++$i;
}
可能有人疑问,为啥不用foreach
因为$news_entry->children() 返回的是DOMElement,而不是HtmlPageCrawler,不能使用filter,还要继续用HtmlPageCrawler::create()。
3、提取新闻正文

$content = HtmlPageCrawler::create(file_get_contents($url.$urls[0]));
print $content->filter("#news_body")->text();
4、说明
有些网站的内容可能不是utf8的这时就要用iconv转码了
可以写个函数封装一下,$base根url,因为很多情况下链接是相对的。
function httpGet($url, $base = null) {
if (!$base) {
$url .= $base;
}
$html = file_get_contents($url);
$encode = mb_detect_encoding($html, "gbk,utf-8");
if (stripos($encode, "utf") !== false) {
return HtmlPageCrawler::create($html);
} else {
$utf_html = iconv("gbk", "utf-8", $html);
return HtmlPageCrawler::create($utf_html);
}
}
如果用html()函数获取html则输出的都是html实体编码,可以用html_entity_decode
另外可以用strip_tags 来去除html里的某些标签。
id是唯一的,而class和标签都不是唯一的,所以获取class和标签,就算只有一个也要用eq(0)还获取
jquery有个has函数判断是否存在某个标签,而HtmlPageCrawler缺少这个,于是手工添加了一个。
在HtmlPageCrawler.php的hasClass函数下面,添加如下代码
public function has($name) {
foreach ($this->children() as $node){
if ($node instanceof \DOMElement) {
$tagName = $node->tagName;
if (stripos($tagName, $name) !== false) {
return true;
}
}
}
return false;
}
php爬虫实践的更多相关文章
- 爬虫实践——数据存储到Excel中
在进行爬虫实践时,我已经爬取到了我需要的信息,那么最后一个问题就是如何把我所爬到的数据存储到Excel中去,这是我没有学习过的知识. 如何解决这个问题,我选择先百度查找如何解决这个问题. 百度查到的方 ...
- PHP网络爬虫实践:抓取百度搜索结果,并分析数据结构
百度的搜索引擎有反爬虫机制,我先直接用guzzle试试水.代码如下: <?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:5 ...
- JAVA爬虫实践(实践一:知乎)
爬虫顺序 1.分析网站网络请求 通过浏览器F12开发者工具查看网站的内容获取方式. 2.模拟HTTP请求,获取网页内容. 可以采用HttpClient,利用JAVA HttpClient工具可以模拟H ...
- python爬虫实践(二)——爬取张艺谋导演的电影《影》的豆瓣影评并进行简单分析
学了爬虫之后,都只是爬取一些简单的小页面,觉得没意思,所以我现在准备爬取一下豆瓣上张艺谋导演的“影”的短评,存入数据库,并进行简单的分析和数据可视化,因为用到的只是比较多,所以写一篇博客当做笔记. 第 ...
- python爬虫实践(一)
最近在学习爬虫,学完后想实践一下,所以现在准备爬取校花网的一部分图片 第一步,导入需要的库 from urllib import request #用于处理request请求和获得响应 from ur ...
- 零python基础--爬虫实践总结
网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 爬虫主要应对的问题:1.http请求 2.解析html源码 3.应对反爬机制. 觉得爬虫挺有意思的,恰好看到知乎有人分享的一个爬虫 ...
- Python 3 Anaconda 下爬虫学习与爬虫实践 (1)
环境python 3 anaconda pip 以及各种库 1.requests库的使用 主要是如何获得一个网页信息 重点是 r=requests.get("https://www.goog ...
- 基于nightmare的美团美食商家爬虫实践
前言美团商家页分析需要爬取的数据有(这里没有按人数爬)爬虫工具选取pysipderscrapynightmare同步任务js动态加载中断继续爬坑总结示例代码 前言 上学的时候自己写过一些爬虫代码,比较 ...
- C#爬虫实践
忘了什么时候加的,iPad上的人人视频追剧了<我的天才女友>,没事的时候看了下,感觉还不错,进一步了解到原著那不勒斯四部曲,感觉视频进度有些慢,就想找找书看看,一时没找到[PS:购买实体书 ...
- 爬虫实践--CBA历年比赛数据
闲来无聊,刚好有个朋友来问爬虫的事情,说起来了CBA这两年的比赛数据,做个分析,再来个大数据啥的.来了兴趣,果然搞起来,下面分享一下爬虫的思路. 1.选取数据源 这里我并不懂CBA,数据源选的是国内某 ...
随机推荐
- (转)Content-Disposition的使用和注意事项
最近不少Web技术圈内的朋友在讨论协议方面的事情,有的说web开发者应该熟悉web相关的协议,有的则说不用很了解.个人认为这要分层次来看待这个问 题,对于一个新手或者刚入门的web开发人员而言,研究协 ...
- apachebench的简单使用
apachebench的简单使用 2013-03-08 15:48:47 分类: LINUX ApacheBench是 Apache 附带的一个小工具,专门用于 HTTP Server 的benchm ...
- ios block常见的错误(一)
Block是OC中的一种数据类型,在iOS开发中被广泛使用. 在实际的使用和面试过程中,经常发现同事或面试者对block了解得不够透彻,本博文将列举常见block错误来对其加深理解. 示例代码1: ; ...
- AjaxControlToolkit的使用
摘自:http://www.cnblogs.com/zm235/archive/2008/05/09/1189558.html 暂时的做法: 把AjaxControlToolkit.dll复制到项目的 ...
- 让 linux centos 文件夹地址栏 位置栏显示出来的方法
今天又拿起心爱的 linux ,发现多日不用又忘记了不少知识了 , 发现忘记的速度真是惊人的! 设置方法: 编辑-> 首选项-> 勾选 总是在浏览器窗口中打开, 如图:
- Ubuntu共享WiFi(AP)给Android方法
更新: 2012-03-03 Android是不支持Ad-hoc模式的WiFi.Windows 7软AP一个还是比较简单的.本文介绍在Ubuntu下实现软AP.(需要你的无线网卡支持AP哈) ...
- UltraEdit程序设置添加到右键菜单
http://hellofs.blog.51cto.com/6109153/1180681 以前安装UltraEdit软件,在安装过程中选择将其添加到右键菜单,安装完成后就可以正常显示在右键菜单,这样 ...
- 下载url地址的图片
// string url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=cNaaMfvhpb1vmcVRXRAdI ...
- System V IPC
1.概述 System V IPC共有三种类型:System V消息队列.System V 信号量.System V 共享内存区. System V IPC操作函数如下: 2.key_t键和ftok函 ...
- cocos2dx 3.x fullPathForFilename及isFileExist在ios/mac下与win32下行为不同
一,fullPathForFilename 项目先开发了ios/mac版本,这两天想把win32工程也配好,但遇到了部分资源无法正确找到的问题. 进一步观察发现,对于那些找不到的资源路径,fullPa ...