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,数据源选的是国内某 ...
随机推荐
- 转:eclipse里面显示中文乱码
显示中文会变成乱码解决方案:Windows- >Pereferences- >General->Workspace- >Text File Encoding 选项下 ...
- 优股社区logo
- Linux(CentOS)的server安装及配置图解(图文)
CentOS,据说这个如今在server上装机量非常大. 安装的分区划分 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdXBpMnU=/font/5a6L ...
- 【LeetCode】166. Fraction to Recurring Decimal
Fraction to Recurring Decimal Given two integers representing the numerator and denominator of a fra ...
- eclipse 在Servers窗口创建一个Tomcat 6.0 Server失败
web项目部署到tomcat除了用eclipse插件,eclipse也有一个Servers窗口来部署. 问题背景:Servers窗口,我之前创建过一个Tomcat v6.0 Server,后来我把 ...
- Linux 分区注意事项
必须分区: 1)/(根分区) 2)/swap(交换分区,当内存不超过4G时,建议swap大小为内存2倍,若超过4G,建议交换分区跟内存一样大) 推荐分区 /boot(启动分区,单独分区,最新200M)
- Android应用如何适配不同分辨率的手机
主要分三块考虑 1 )界面配置 根据不同的分辨率,创建手机界面文件 例子: 在res下创建 layout-800x480 layout-480x320 并在各自不 ...
- Python 列表 insert() 方法
描述 Python 列表 insert() 方法将指定对象插入到列表中的指定位置. 语法 insert() 方法语法: L.insert(index,obj) 参数 index -- 对象obj需要插 ...
- ios app 实现热更新(无需发新版本号实现app加入新功能)
眼下可以实现热更新的方法,总结起来有下面三种 1. 使用FaceBook 的开源框架 reactive native,使用js写原生的ios应用 ios app能够在执行时从server拉取最新的js ...
- C#--索引
索引是一组get和set访问器,类似于属性的访问器. 索引和属性在很多方面是相似的. 和属性一样,索引不用分配内存来存储: 索引和属性都主要被用来访问其他数据成员,这些成员和他们关联,他们为这些成员提 ...