php发送Http请求,抓取网页数据方法(cURL,file_get_contents,snoopy)

简介:

php发送Http请求,抓取网页数据方法(cURL,file_get_contents,snoopy)


curl()、file_get_contents()、snoopy.class.php这三个远程页面抓取或采集中用到的工具,他们功能相当,到底有是么优缺点呢,下面逐一介绍:


snoopy.class.php


snoopy 是用 fsockopen 自开发的一个类,效率比较高且不需要服务器特定配置支持,在普通虚拟主机中即可使用,但是经常出问题。官方下载网址:http://sourceforge.net/projects


Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单。

Snoopy的特点:

1、抓取网页的内容 fetch

2、抓取网页的文本内容 (去除HTML标签) fetchtext

3、抓取网页的链接,表单 fetchlinks fetchform

4、支持代理主机

5、支持基本的用户名/密码验证

6、支持设置 user_agent, referer(来路), cookies 和 header content(头文件)

7、支持浏览器重定向,并能控制重定向深度

8、能把网页中的链接扩展成高质量的url(默认)

9、提交数据并且获取返回值

10、支持跟踪HTML框架

11、支持重定向的时候传递cookies

要求php4以上就可以了,由于本身是php一个类,无需扩支持,服务器不支持curl时候的最好选择。


附:

snoopy中文手册:http://wenku.baidu.com/view/a2110c2a192e45361066f53a.html

使用示例:http://outofmemory.cn/code-snippet/2480/php-usage-Snoopy-class-php-do-http-get-post-request

snoopy的缺陷与CURL的强大:http://www.neatstudio.com/show-1047-1.shtml



file_get_contents()


file_get_contents 是 fsockopen 功能的简单打包,效率稍低些,但是抓取成功率很高,所以在 snoopy 出问题的时候我一般那他来。5.0.0 添加了对 context 的支持,有了context,他也可以发送 header 信息,自定义用户 agent, referer, cookies 都不在话下。5.1.0 添加了 offset 和 maxlen 参数,可以只读文件的一部分内容。


curl()


curl一般用来抓取网页,第二种就是get或者post数据,第三种应用就是实现PHP的多线程任务


功能最强大,几乎可以模拟浏览器的各个方面,几乎可以以假乱真。效率也很高,支持多线程,不过需要开启下 curl 扩展。


cURL是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。PHP也支持cURL库,我们常常用来远程页面抓取和采集。


也支持断点续传Range的代码:


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
29
30
31
32
$ch  = curl_init();
curl_setopt( $ch , CURLOPT_URL,  'http://www.spiegel.de/' );
curl_setopt( $ch , CURLOPT_RANGE,  '0-500' );
curl_setopt( $ch , CURLOPT_BINARYTRANSFER, 1);
curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1);
$result  = curl_exec( $ch );
curl_close( $ch );
echo  $result ;
/**
*But as noted before if the server doesn't honor this header but sends the whole file curl will download all of it. E.g. http://www.php.net ignores the header. But you can (in addition) set a write function callback and abort the request when more data is received, e.g.
* php 5.3+ only
* use function writefn($ch, $chunk) { ... } for earlier versions
*/
$writefn  function ( $ch $chunk ) {
   static  $data = '' ;
   static  $limit  = 500;  // 500 bytes, it's only a test
   $len  strlen ( $data ) +  strlen ( $chunk );
   if  ( $len  >=  $limit  ) {
     $data  .=  substr ( $chunk , 0,  $limit - strlen ( $data ));
     echo  strlen ( $data ) ,  ' ' $data ;
     return  -1;
   }
   $data  .=  $chunk ;
   return  strlen ( $chunk );
};
$ch  = curl_init();
curl_setopt( $ch , CURLOPT_URL,  'http://www.php.net/' );
curl_setopt( $ch , CURLOPT_RANGE,  '0-500' );
curl_setopt( $ch , CURLOPT_BINARYTRANSFER, 1);
curl_setopt( $ch , CURLOPT_WRITEFUNCTION,  $writefn );
$result  = curl_exec( $ch );
curl_close( $ch );


使用教程地址:

http://stackoverflow.com/questions/2032924/how-to-partially-download-a-remote-file-with-curl

http://cn2.php.net/manual/zh/ref.curl.php

http://www.360weboy.c      \

om/php/page1/curl.html



本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/1371623,如需转载请自行联系原作者








相关文章
|
JSON 数据处理 PHP
PHP数组处理技巧:高效操作数据集合
PHP数组处理技巧:高效操作数据集合
|
JSON 安全 大数据
PHP中的数组处理艺术:灵活高效的数据操作
PHP中的数组处理艺术:灵活高效的数据操作
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
347 67
HTTP协议探究:常用方法一网打尽
总的来说,HTTP协议的命令犹如一把钥匙,解锁了互联网世界的大门。它是规则,也是工具,了解了它,就等于掌握了互联网的一把通行证。我们每天都在用,也常常无视它,但是只有深刻理解了它,才能更好地运用它。如此,我们的互联网世界旅程就会变得更加顺畅,更加有趣。
300 14
|
JSON 安全 网络协议
HTTP/HTTPS协议(请求响应模型、状态码)
本文简要介绍了HTTP与HTTPS协议的基础知识。HTTP是一种无状态的超文本传输协议,基于TCP/IP,常用80端口,通过请求-响应模型实现客户端与服务器间的通信;HTTPS为HTTP的安全版本,基于SSL/TLS加密技术,使用443端口,确保数据传输的安全性。文中还详细描述了HTTP请求方法(如GET、POST)、请求与响应头字段、状态码分类及意义,并对比了两者在请求-响应模型中的安全性差异。
1169 20
|
API 开发者
了解 HTTP 的PUT 与 POST方法的综合指南
HTTP PUT 和 POST 方法是构建 Web 应用与 API 的核心工具,用于资源的创建与更新。PUT 方法通过指定 URL 更新或创建完整资源,具有幂等性;而 POST 方法更灵活,主要用于创建新资源,但不具备幂等性。本文详细对比了两者在请求体、URL 使用、资源处理等方面的区别,并提供了实际应用示例,帮助开发者根据场景选择合适的方法以优化 API 设计。
1128 13
|
缓存 人工智能 边缘计算
HTTP代理:网页加速的隐形引擎
本文深入探讨HTTP代理在提升网页加载速度中的核心作用与技术原理。通过请求中转、协议优化及传输层加速,结合智能缓存、动态压缩、全球负载均衡和协议升级四大黑科技,实现显著性能提升。同时分析其潜在代价与挑战,并展望边缘计算、AI驱动等未来趋势,为选型提供实用指南。
594 10
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
1199 5
|
存储 缓存 搜索推荐
HTTP500代码怎么解决?常见的5xx网页错误及其原因
本文介绍了如何修复HTTP 500错误及常见的5xx网页错误。500错误表示服务器无法处理请求,可能由文件权限、脚本错误、数据库连接或配置问题引起。作为用户,可尝试重新加载页面、检查URL或清除缓存;作为网站所有者,需检查`.htaccess`文件、服务器日志、插件冲突及PHP版本等。此外,文章还列举了其他5xx错误(如502、503、504等)及其原因,帮助定位和解决服务器端问题,避免影响流量与搜索引擎排名。
10504 4
|
Oracle 关系型数据库 MySQL
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
本文分析了YashanDB中PHP通过ODBC查询数据时出现的数据截断问题,表现为超过256字节的数据被截断,以及isql工具无法显示超过300字节长度的数据。问题根源在于YashanDB的ODBC驱动仅支持单次查询,且PHP扩展库默认缓冲区限制。解决方案包括改用PHP ODBC扩展库而非PDO_ODBC,以及调整isql代码逻辑以支持循环取数或一次性读取完整数据。文章还提供了具体代码示例和规避方法,适用于23.2.4.14及更早版本。
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题

热门文章

最新文章