第一篇文章介绍了使用原生的PHP和PHP的扩展库实现了爬虫技术。本文尝试使用PHP爬虫框架来写,首先对三种爬虫技术phpQuery,PHPcrawer, snoopy进行对比,然后分析模拟浏览器行为的方式,重点介绍下snoopy

所有代码挂在我的github上
1.几种常用的PHP爬虫框架对比

1.1 phpQuery

优势:类似jquery的强大搜索DOM的能力。
pq()是一个功能强大的搜索DOM的方法,跟jQuery的$()如出一辙,jQuery的选择器基本上都能使用在phpQuery上,只要把“.”变成“->”,Demo如下(对应我的github的Demo5)

<?php
require('phpQuery/phpQuery.php');
phpQuery::newDocumentFile('http://www.baidu.com/');
$menu_a = pq("a");
foreach($menu_a as $a){
echo pq($a)->html()."<br>";
}
foreach($menu_a as $a){
echo pq($a)->attr("href")."<br>";
}
?>

1.2 PHPcrawer

优势:过滤能力比较强。
官方给的Demo如下(我的github中对应demo4):

<?php
include("PHPCrawl/libs/PHPCrawler.class.php");
class MyCrawler extends PHPCrawler
{
function handleDocumentInfo(PHPCrawlerDocumentInfo $PageInfo)
{ // As example we just print out the URL of the document
echo $PageInfo->url."<br>";
}
}
$crawler = new MyCrawler();
$crawler->setURL("www.baidu.com");
$crawler->addURLFilterRule("#\.(jpg|gif)$# i");
//过滤到含有这些图片格式的URL
$crawler->go();
?>

1.3 snoopy

优势:提交表单,设置代理等
Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单,
demo如下(对应github中的demo3):

include 'Snoopy/Snoopy.class.php';
$snoopy = new Snoopy();
$url = "http://www.baidu.com";
// $snoopy->fetch($url);
// $snoopy->fetchtext($url);//去除HTML标签和其他的无关数据
$snoopy->fetchform($url);//只获取表单
//只返回网页中链接 默认情况下,相对链接将自动补全,转换成完整的URL。
// $snoopy->fetchlinks($url);
var_dump($snoopy->results);

  

1.4 phpspider

优势:安装配置到数据库
提供了安装配置,能够直接连接mysql数据库,使用也是比较广泛,这里我们暂时不单独介绍。

2.模拟用户行为

2.1 file_get_contents

<?php
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
)
); $context = stream_context_create($opts); /* Sends an http request to www.example.com
with additional headers shown above */
$fp = fopen('http://www.example.com', 'r', false, $context);
fpassthru($fp);
fclose($fp);
?>

  

2.2 curl

$ch=curl_init(); //初始化一个cURL会话
curl_setopt($ch,CURLOPT_URL,$url);//设置需要获取的 URL 地址
// 设置浏览器的特定header
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Host: www.baidu.com",
"Connection: keep-alive",
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Upgrade-Insecure-Requests: 1",
"DNT:1",
"Accept-Language: zh-CN,zh;q=0.8,en-GB;q=0.6,en;q=0.4,en-US;q=0.2",
"Cookie:_za=4540d427-eee1-435a-a533-66ecd8676d7d;"
));
$result=curl_exec($ch);//执行一个cURL会话

  

2.3 snoopy

表单提交
我们的一个例子
form-demo.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form-demo</title>
</head>
<body>
<form action="./form-demo.php" method="post">
用户名:<input type="text" name="userName"><br>
密 码:<input type="password" name="password"><br>
<input type="submit">
</form>
</body>
</html>

form-demo.php

<?php
$userName = $_POST['userName'];
$password = $_POST['password'];
if($userName==="admin"&&$password==="admin"){
echo "hello admin";
}else{
echo "login error";
}
?>

```
提交表单

<?php
include 'Snoopy/Snoopy.class.php';
$snoopy = new Snoopy();
$formvars["userName"] = "admin";
//userName 与服务器端/表单的name属性一致
$formvars["password"] = "admin";
$action = "http://localhost:8000/spider/demo3/form-demo.php";//表单提交地址
$snoopy->submit($action,$formvars);
echo $snoopy->results;
?> <div class="se-preview-section-delimiter"></div>

  

问题1:openssl extension required for HTTPS 增加对https的支持
php.in ==> ;extension=php_openssl.dll 去除注释

<div class="se-preview-section-delimiter"></div>

  

问题2:405 Not Allowed增加

$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)"; //伪装浏览器
$snoopy->referer = "http://www.icultivator.com"; //伪装来源页地址 http_referer
$snoopy->rawheaders["Pragma"] = "no-cache"; //cache 的http头信息
$snoopy->rawheaders["X_FORWARDED_FOR"] = "122.0.74.166"; //伪装ip <div class="se-preview-section-delimiter"></div>

问题3 : snoopy使用代理

$snoopy->proxy_host = "http://www.icultivator.com";
// HTTPS connections over proxy are currently not supported
$snoopy->proxy_port = "8080"; //使用代理
$snoopy->maxredirs = 2; //重定向次数
$snoopy->expandlinks = true; //是否补全链接 在采集的时候经常用到
$snoopy->maxframes = 5; //允许的最大框架数

问题:
其实尝试了网站进行提交表单是有问题的。这样简单的处理是不能提交表单的,使用代理也是有问题
的。snoopy框架确实会有很多问题,后面有解决思路了再说。

参考阅读:
- cURL、file_get_contents、snoopy.class.php 优缺点
- 开源中国-PHP爬虫框架列表
- phpQuery
- Snoopy下载地址
- Snoopy —— 强大的PHP采集类使用详解及示例:采集、模拟登录及伪装浏览器
- 开源中国-snoopy博客列表
————————————————
版权声明:本文为CSDN博主「TechFE」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/future_todo/article/details/52804440

PHP爬虫最全总结2-phpQuery,PHPcrawer,snoopy框架中文介绍的更多相关文章

  1. 爬虫、网页测试 及 java servlet 测试框架等介绍

    scrapy 抓取网页并存入 mongodb的完整示例: https://github.com/rmax/scrapy-redis https://github.com/geekan/scrapy-e ...

  2. 最近用.NET实现DHT爬虫,全.NET实现

    最近用.NET实现DHT爬虫,全.NET实现,大家可以加我QQ交流下  309159808

  3. [python爬虫] Selenium常见元素定位方法和操作的学习介绍

    这篇文章主要Selenium+Python自动测试或爬虫中的常见定位方法.鼠标操作.键盘操作介绍,希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~同时CSDN总是屏蔽这篇文章,再加上最近 ...

  4. [python爬虫] Selenium常见元素定位方法和操作的学习介绍(转载)

    转载地址:[python爬虫] Selenium常见元素定位方法和操作的学习介绍 一. 定位元素方法 官网地址:http://selenium-python.readthedocs.org/locat ...

  5. 2015年最全的移动WEB前端UI框架

    目前,众多互联网公司APP都嵌入了大量的HTML5,移动端的开发越来越重视,HTML5的运用场景也越来越多了.在移动WEB开发的过程中,使用合适的移动WEB UI框架可以大大提升我们的开发效率.下面P ...

  6. [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

    前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时 ...

  7. 爬虫--Scrapy框架课程介绍

    Scrapy框架课程介绍: 框架的简介和基础使用 持久化存储 代理和cookie 日志等级和请求传参 CrawlSpider 基于redis的分布式爬虫 一scrapy框架的简介和基础使用 a)    ...

  8. 爬虫写法进阶:普通函数--->函数类--->Scrapy框架

    本文转载自以下网站: 从 Class 类到 Scrapy https://www.makcyun.top/web_scraping_withpython12.html 普通函数爬虫: https:// ...

  9. 古语云:工欲善其事必先利其器 --> 最新、最全的 IntelliJ IDEA(2018.3.3) 的介绍、安装、破解、配置与使用

    原文:古语云:工欲善其事必先利其器 --> 最新.最全的 IntelliJ IDEA(2018.3.3) 的介绍.安装.破解.配置与使用 一.IntelliJ IDEA 介绍 -> Ecl ...

随机推荐

  1. Homestead can not mount nfs on macos catalina

    It's not a vagrant issue but nfsd/macos issue.If you add to /etc/exports line:/Users/USERNAME/Docume ...

  2. Oracle 修改SID --不建议修改

    1.登录数据库查看SID select instance_name,status from v$instance; 2.关闭数据库 shutdown immdiate; 3.修改/etc/oratab ...

  3. git 切换远程已有分支

    本地分支a,且没有分支b,想要切换到远程以后分支b 1. git remote update origin --prune 更新本地分支列表与远程一致 2. git branch 查看本地所有分支,是 ...

  4. 2017.11.7 Noip2017 考前模拟赛

    ----------------------------------T1---------------------------------- ——>数学老师的报复 题目描述 11 班数学大佬 Y ...

  5. Linux 下Mongdb数据库

    一.安装mongdb 1.创建安装目录 # mkdir /data/local # mkdir /data/local/mongodbdata 2.解压安装包 # tar -xvf /software ...

  6. CentOS 7 常用命令大全(转)

    博主最近疯狂迷恋上linux的centos 7 系统,特意从网上找了一篇centos 7的命令大全来学习,下面我分享下这个博客. 转载自:https://blog.csdn.net/o0darknes ...

  7. Linux下vim卡死原因

    使用vim的时候,偶尔会碰到vim莫名其妙的僵在那里. 解决方案: 经查,原来Ctrl+S在Linux里是锁定屏幕的快捷键,如果要解锁,按下Ctrl+Q就可以了. 经验总结: 牢记这两个VIM组合键 ...

  8. checkbox后台传个list显示和回显的页面代码C标签

        <c:forEach items="${listtest}" var="provinces">        <input type= ...

  9. Linux信号使用及自定义信号

    linux自定义信号:https://www.cnblogs.com/bigben0123/p/3186661.html linux信号.值及解释:https://blog.csdn.net/luot ...

  10. java之map遍历

    java开发中常常会用到遍历,所以下边就列举四种map的遍历方法. public class testMap { public static void main(String[] args) { Ma ...