为什么80%的码农都做不了架构师?>>>
做了N年的PHP,采集了N家数据,由初学者菜鸟,到现在的熟手,采集天猫、淘宝、腾讯、京东、敦煌、Lightinthebox、大龙、zencart、magento、prestashop、opencart、xcart、踏踏。。。。对采集颇有诸多的理解。
现在给大家分析下,如有误,请指出。
我能想到的常用采集方法:
1. file
支持应用层协议,返回的数据是以数组形式返回,需要开启allow_url_fopen.
长处:擅长处理本地文件
短处:不擅长处理URL这类的采集,大并发时会丢包、超时,适合处理本地小文件。
2. file_get_contents
支持应用层协议,返回的数据是以字符串形式返回,需要开启allow_url_fopen.
长处:擅长处理本地文件
短处:不擅长处理URL这类的采集,大并发时会丢包、超时,适合处理本地小文件。
3. fopen
支持应用层协议,返回的数据是以字符串形式返回,需要开启allow_url_fopen.
长处:擅长处理本地文件
短处:不擅长处理URL这类的采集,大并发时会丢包、超时,适合处理本地大文件。
4. copy
支持应用层协议,直接把远程文件拉倒本地,成功返回true,失败返回false,需要开启allow_url_fopen.
长处:擅长处理本地文件
短处:需要把远程文件拽下来后,再正则分析抓取,占用硬盘,大并发时会丢包、超时,适合处理本地文件的拷贝。
//-------------------------//py by http://my.oschina.net/cart---------------------
5. curl
支持应用层协议,需要开启CURL扩展
长处:采集时可以对DNS进行缓存,采集速度快。GET\POST\PUT\DELETE 模仿用户头信息、伪造IP、远程登录。。。
短处:不支持底层通信,如TCP\IP\UDP\CMP。。
6. socket
支持通信层协议,需要开启socket扩展
长处:网络传输层和网络应用层的接口API,强大无比,CURL可以干的,socket也可以干,
socket可以干的,CURL不一定可以干。
短处:一般服务器默认不开启socket扩展,此乃属于网络编程,对技术人员要求较高。
只支持底层(通信层套接字)通信,不支持应用层通信。采集速度慢于CURL。
7. fsockopen
支持通信层协议 PHP自带的方法 文件操作的方式 File
长处:功能同6中的socket,但这是PHP自带的方法,不需要扩展支持。是socket的又一次封装,使用更简单.
短处:采集速度慢于curl。
8.stream_socket_client
支持通信层协议 PHP自带的方法 流操作的方式 Stream
长处:功能同6中的socket,但这是PHP自带的方法,不需要扩展支持。是socket的又一次封装,使用更简单.
短处:采集速度慢于curl。
9.readfile
支持应用层协议,直接把远程文件拉倒本地,成功返回从文件中读入的字节数,失败返回false.
长处:基于缓冲区的大文件处理,适合大文件下载等应用。
短处:不能直接像curl那种直接下载大文件,否则出错,必须配合缓冲区使用。
读完上述,大家有何感觉?
个人推荐:
curl:基本涵盖所有的采集应用:蜘蛛爬虫、大文件下载、批量采集、浏览器伪装…更以采集速度快,可以缓存DNS所以采集速度快而闻名。
fsockopen、socket、stream_socket_client:更底层的处理,底层编程,如银行业务、游戏底层通信等,虽然慢,但是稳定。
fopen、file、filegetcontents、copy:更偏向适合本地文件的处理,处理远程文件的话,效果不佳,作者不推荐。
readfile:由于配合缓冲区的独特优势,更适合大文件的在线下载。而且下载不卡,对服务器拖累很小。
这里 顺便补充一句,
为什么我用fsockopen(socket)用TCP 80端口访问百度可以访问,
我浏览器直接输入tcp://www.baidu.com、tcp:http://www.baidu.com:80 却访问不了呢?
答:
因为浏览器是应用层,fsockopen(socket)是传输层, 天生就不支持那样的使用哦!
如果你的目标站点没有防采集措施,可以轻易使用Linux命令来达到轻松采集,一般用在下载网站模板、网站扒皮、批量采集场景:
wget -r -p -np -k https://www.oschina.net/