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;
    }
时间: 2024-10-02 06:21:00

php爬虫实践的相关文章

爬虫实践——数据存储到Excel中

在进行爬虫实践时,我已经爬取到了我需要的信息,那么最后一个问题就是如何把我所爬到的数据存储到Excel中去,这是我没有学习过的知识. 如何解决这个问题,我选择先百度查找如何解决这个问题. 百度查到的方法千万种,我先选择看得懂的文章下手,不断尝试,最后解决了问题 那么到底如何解决这个问题呢? 解决这个问题要用到三个模块分别是xlwt.xlrd和xlutils 在使用这两个模块时要先下载安装它们,我用的是pycharm编写程序,我用到的安装方法是: #在文件中导入xlwt.xlrd 和xlutils

零python基础--爬虫实践总结

网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 爬虫主要应对的问题:1.http请求 2.解析html源码 3.应对反爬机制. 觉得爬虫挺有意思的,恰好看到知乎有人分享的一个爬虫小教程:https://zhuanlan.zhihu.com/p/20410446 立马学起! 主要步骤: 1.按照教程下载python.配置环境变量,学习使用pip命令.安装开发ide:pycharm 2.学习使用python发送请求获取页面 3.使用chrome开发者工具观察页面结构特征,使用b

基于nightmare的美团美食商家爬虫实践

前言美团商家页分析需要爬取的数据有(这里没有按人数爬)爬虫工具选取pysipderscrapynightmare同步任务js动态加载中断继续爬坑总结示例代码 前言 上学的时候自己写过一些爬虫代码,比较简陋,基于HttpRequest请求获取地址返回的信息,再根据正则表达式抓取想要的内容.那时候爬的网站大多都是静态的,直接获取直接爬即可,而且也没有什么限制.但是现在网站的安全越来越完善,各种机器识别,打码,爬虫也要越来越只能才行了. 前段时间有需求要简单爬取美团商家的数据,做了一些分析,实践,在这

爬虫实践---排行榜小说批量下载

一.目标 排行榜的地址:http://www.qu.la/paihangbang/ 找到各类排行旁的的每一部小说的名字,和在该网站的链接. 二.观察网页的结构 很容易就能发现,每一个分类都是包裹在: <div class="index_toplist mright mbottom"> 之中,这种条理清晰的网站,大大方便了爬虫的编写. 在当前页面找到所有小说的连接,并保存在列表即可. 三.列表去重的小技巧: 就算是不同类别的小说,也是会重复出现在排行榜的.这样无形之间就会浪费

爬虫实践---电影排行榜和图片批量下载

1.目标网址:http://dianying.2345.com/top/ 需要找到的信息:电影的名字,主演,简介,和标题图片 2.查看页面结构: 容易看到,需要的主题部分,都被包裹在‘<ul>“列表标签里, 那么简单的用bs4库找到 "<ul>" tag并迭代取出每一条“<li>”tag, 最后再从每个<li>标签里找到需要的信息即可. 3.图片下载: 在电影排行榜爬虫当中,有一项目标是:爬取每个电影的标题图, 那么如何以文本的形式爬下来

JAVA爬虫实践(实践三:爬虫框架webMagic和csdnBlog爬虫)

WebMagic WebMagic是一个简单灵活的Java爬虫框架.基于WebMagic,你可以快速开发出一个高效.易维护的爬虫. 采用HttpClient可以实现定向的爬虫,也可以自己编写算法逻辑来实现多线程,创建链接池,自动解析网页代码获取请求链接,封装正则表达式等等. 但是如果使用框架,就不再需要考虑爬虫的逻辑,只需要专注HTML内容的解析和获取. 引用WebMagic后写一个爬虫只需要编写一个类实现PageProcessor接口,实现两个方法. 一个WebMagic例子 package

爬虫实践---悦音台mv排行榜与简单反爬虫技术应用

由于要抓取的是悦音台mv的排行榜,这个排行榜是实时更新的,如果要求不停地抓取,这将有可能导致悦音台官方采用反爬虫的技术将ip给封掉.所以这里要应用一些反爬虫相关知识. 目标网址:http://vchart.yinyuetai.com/vchart/trends?area=ML 网站结构: 上面红线圈出来的地方都是需要注意的小细节: 首先 排行榜分为,内地.港台.欧美.韩国.日本五个地区分别将其点开能够观察到url的变化为在最尾部加了一个参数:area=地区参数 很容易的就能知道参数列表:['ML

爬虫实践-爬取糗事百科网段子信息

qiushibaike.py: # 导入相应的库文件import requestsimport re # 加入请求头headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'} # 初始化列表,用于装入爬虫信息info_lists = [] # 定义获取用户性别的函数def j

【个人】爬虫实践,利用xpath方式爬取数据之爬取虾米音乐排行榜

实验网站:虾米音乐排行榜 网站地址:http://www.xiami.com/chart 难度系数:★☆☆☆☆ 依赖库:request.lxml的etree (安装lxml:pip install lxml) IDEA开发工具:PyCharm_2017.3 Python版本:Python3 期望结果:爬取出排行版歌名以及对应歌手 运行效果图: 音乐排行榜: 爬取数据结果图: 像这种简单的爬取就没必要使用Scrapy框架进行处理,是在有点大材小用,不过如果你刚开始学Scrapy的话,拿这些简单的练

爬虫实践

1.URL爬取 爬取一个站点的所有URL,大概有以下步骤: 1.确定好要爬取的入口链接. 2.根据需求构建好链接提取的正则表达式. 3.模拟成浏览器并爬取对应的网页. 4.根据2中的正则表达式提取出该网页中包含的链接. 5.过滤重复的链接. 6.后续操作,打印链接或存到文档上. 这里以获取 https://blog.csdn.net/ 网页上的链接为例,代码如下: 1 import re 2 import requests 3 4 def get_url(master_url): 5 heade