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,数据源选的是国内某 ...
随机推荐
- spring cloud单点登录
概述 基于springcloud的单点登录服务及基于zuul的网关服务(解决了通过zuul转发到认证服务之后session丢失问题) 详细 代码下载:http://www.demodashi.com/ ...
- IT忍者神龟之 oracle行转列、列转行
一.行转列 须要将例如以下格式 转换为: 这就是最常见的行转列,主要原理是利用decode函数.聚集函数(sum).结合group by分组实现的 create table test( id varc ...
- 【环境配置】配置ndk
1. 背景 Android平台从诞生起,就已经支持C.C++开发. 众所周知,Android的SDK基于Java实现.这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言.但这 ...
- android API之android.text.TextWatcher
When an object of a type is attached to an Editable, its methods will be called when the text is cha ...
- 用curl去探测接口是否正常返回结果,若没有正常返回则触发报警
现有一需求去curl 在香港的一个接口, 返回值有时正常有时报错 connection reset by peer . 思路: 若 执行成功 $?返回 0 , 不成功则返回其他数字 #!/bin/b ...
- Windows下面安装和配置MySQL(5.6.20)
1.首先到http://dev.mysql.com/ 上下载windows版mysql5.6免安装zip包.然后将zip包解压到D:\mysql-5.6.20-winx64下. 2.复制mysql下的 ...
- 【js】批量判断表单中的文本框非空
方法一: <script type=”text/javascript”> /* * 批量验证表单非空 * 需要非空验证控件的样式class=”mustadd” */ $(".mu ...
- WebDav的java客户端开发包:sardine
最近需要对WebDav服务器进行操作,查找了一下,基于java的开发包主要有这几个: slide Jackrabbit sardine webdavclient4j 其中slide是apache的一个 ...
- VS2010中遇到_WIN32_WINNT not defined
VS2010中编程时遇到这个问题 _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h) 解决办法: ...
- nginx实战三
nginx正向代理 https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/z_proxy.md Nginx正向代理使用场景并不多见 ...