PHP爬虫

我居然能用爬虫抓数据了,继正则之后又迈过一道坎。

使用PHP Simple HTML DOM Parser这个库,然后自己对DOM选择器做一下二次封装,基本上可以应付一部分WordPress站点。

入门

引入PHP Simple HTML DOM Parser这个库,然后使用file_get_html()抓取目标网址后,就能像操作jQuery一样来抓取我们需要的东西了。

由于内网网络不通缘故,我使用爬虫的时候,给PHP配置了代理。正常网络环境, file_get_html($url) 即可,不需要后面两个参数。

<?php
require('./simple_html_dom.php');
$proxy = stream_context_create(array(
   'http' => array(
        'timeout' => 5,
        'proxy' => 'tcp://proxy.domain.com:8080',
        'request_fulluri' => True,
    )
));
 
$targetHTML = file_get_html($targetURL, false, $proxy);
echo($targetHTML->find('title')->plaintext);
?>

整站爬取

根据WordPress的分页规则,判断是否有下一页。

注意整站抓取的时候,需要修改PHP最大执行时间,使其可以长时间执行。

<?php
ini_set('max_execution_time',0);
?>

缓存抓取结果

整站抓取的时候,由于时间很长,未避免中途脚本出错,导致的重新执行整个爬取流程,可以对每个URL的抓取结果,进行Cache。

为了我中途检查和后续处理方便,我直接把抓取结果保存成CSV格式,以爬虫的URL为单位。

<?php
 
/**
 * 爬回来的数据,按URL缓存成CSV文件
 * @param $filename
  * @param $array
 */
public function cache($filename, $array){
    $filename = explode('//',$filename)[1];
    $filename = str_replace('.','_',$filename);
    $filename = str_replace('/','_',$filename);
    $filename = './data/'.$filename.'.csv';
 
    $fp = fopen($filename, 'w');
 
    foreach ($array as $fields) { 
        fputcsv($fp, $fields);
    }
 
    fclose($fp);
}
?>

结语

抓一个页面容易,但是整站抓取,很容易被反爬虫策略给挡在外面。一个好的爬虫,功夫都在策略的应对上面。

这次是以PHP-CLI的形式写的,中途出错只能重新执行(浏览器输入URL或者重新执行PHP-CLI),不稳定。

下次看看怎么改成以进程的形式执行,这样就不怕长时间执行出问题了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 手札《nginx – A Practical Guide to High Performance》

    今晚无意发现Nginx官方出了一本Guide to Hight Performance的书,翻了一下,有一些蛮有意思的点。

    libo1106
  • PushPlugin-为iOS的Hybird App提供APNS服务

    APNS是iOS生态下面的推送机制。其原理是APP启动的时候,向苹果注册,并获得一个唯一token,然后不论app是否继续在运行,都可以通过调用苹果的APNS服...

    libo1106
  • 最近弄HybridApp的一些心得

    SDK的项目折腾了一个月,终于快到收获的时候,把这过程中的一些心得体会记录一下吧~

    libo1106
  • 如何保证消息队列的顺序性?

    其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题。

    李红
  • 如何保证消息的顺序性?

    我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一...

    IT技术小咖
  • pandas库Series类型与基本操作

    py3study
  • 「基础编程学习」 「PHP7数组详解」:第1章 (8)数组和对象

    举一个例子,比如说一个班级,有一个班级号,班级名,描述,房间号,教导员,班级人数。可以存到一个数组内,这样写:

    程序员小助手
  • Django 实战1:搭建属于自己社工查询系统(上)

    前面的文章已经把模板、模型、视图、表单等知识点逐一讲解,大家已经熟悉它们具体用法。但如何将其串联起来还一筹莫展。本篇文章分享我之前做过的一个小项目,帮助大家抹开...

    猴哥yuri
  • Android RxJava 实战讲解:合并数据源 & 同时展示数据

    Carson.Ho
  • 3 手写实现SpringMVC,第三节:通过反射给属性和参数注入值

    在上一篇已经完成了读取beanName->Object映射关系的功能,这一篇就是把读取到的映射注入到属性中。

    天涯泪小武

扫码关注云+社区

领取腾讯云代金券