PHP爬虫最全总结2-phpQuery,PHPcrawer,snoopy框架中文介绍

news/2024/7/19 12:02:35 标签: php, 爬虫, javascript

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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);
?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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会话
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

form-demo.php

<?php 
    $userName = $_POST['userName'];
    $password = $_POST['password'];
    if($userName==="admin"&&$password==="admin"){
        echo "hello admin";
    }else{
        echo "login error";
    }
 ?>
 ```
提交表单
```php
<?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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

问题1:openssl extension required for HTTPS 增加对https的支持

php.in ==> ;extension=php_openssl.dll 去除注释




<div class="se-preview-section-delimiter"></div>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

问题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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

问题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; //允许的最大框架数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

转载于:https://my.oschina.net/u/588516/blog/1785777


http://www.niftyadmin.cn/n/1821811.html

相关文章

ajax对日期处理,散景如何使用Ajax更新数据源处理日期时间

我正在玩一个围绕Bokeh和AJAX构建的新的无服务器报告系统&#xff0c;并且遇到了日期和时间问题。我有一个版本&#xff0c;可将数字数据从云函数流式传输到通过Bokeh生成的html文件。非常类似于&#xff1a;这种方法效果很好&#xff0c;但在将日期时间添加到方程式时&#xf…

LVS 工作模式以及工作原理

https://blog.csdn.net/caoshuming_500/article/details/8291940https://www.cnblogs.com/oskb/p/5667462.html转载于:https://blog.51cto.com/wwdhks/2091895

网站无法连接到数据库服务器,BarTender无法连接到数据库解决方法

由于各种原因&#xff0c;在使用BarTender连接到数据库时&#xff0c;有可能会出现无法连接的问题&#xff0c;下面下编就针对两种BarTender无法连接到数据库的问题&#xff0c;来教大家解决的方法。第一种 BarTender无权打开文件解决方法对于BarTender 10.1中错误消息#3246&am…

第六章:nginx实现动静分离

为什么要做动静分离呢&#xff1f; 减少不必要的请求消耗&#xff0c;减少请求延时。 怎么才能做到动静分离呢&#xff1f; 首先我们得想什么是静态东西&#xff0c;什么需要动态获取。我想大家心里肯定都很清楚&#xff0c;图片、影视、音乐等文件一般属于静态文件&#xff0c…

ftb服务器复制文件,ftp服务器复制文件

ftp服务器复制文件 内容精选换一换在IntelliJ上选择“项目”&#xff0c;找到“.idea”文件夹&#xff0c;单击右键选择“新建>文件”&#xff0c; 输入文件名“settings.json”生成settings.json文件。如图1所示。复制以下代码至新创建的settings.json文件中&#xff0c;修…

Java反射 私有字段和方法

尽管普遍认为通过Java Reflection可以访问其他类的私有字段和方法。 这并不困难。 这在单元测试中可以非常方便。 本文将告诉你如何。 ###访问私有字段 要访问私有字段&#xff0c;您需要调用Class.getDeclaredField&#xff08;String name&#xff09;或Class.getDeclaredFie…

vue修改服务器地址,vue怎么修改添加服务器地址

vue怎么修改添加服务器地址 内容精选换一换本章节指导用户为Windows系统的ECS主机添加域名解析并添加安全组&#xff0c;防止下载Agent安装包与采集监控数据时出现异常。修改ECS的DNS配置有两种方式&#xff1a;Windows图形化界面和管理控制台。您可以根据自己的使用习惯选择其…

聊聊Shiro

Shiro是项目中用的比较多Java安全框架&#xff0c;能满足大多数项目的安全认证、授权流程。相比SpringSecurity的复杂重量级&#xff0c;它更简单易用。 Shiro中最关键的两个概念是认证和授权&#xff0c;前者解决确认用户身份问题&#xff0c;可以是用户名密码或者是指纹或证书…