php 使用代理IP进行数据抓取
2023-09-14 08:56:56 时间
什么是代理?什么情况下会用到代理IP?
代理服务器(Proxy Server),其功能就是代用户去取得网络信息,然后返回给用户。形象的说:它是网络信息的中转站。通过代理IP访问目标站,可以隐藏用户的真实IP。
比如你要抓取一个网站数据,该网站有100万条内容,他们做了IP限制,每个IP每小时只能抓1000条,如果单个IP去抓因为受限,需要40天左右才能采集完,如果用了代理IP,不停的切换IP,就可以突破每小时1000条的频率限制,从而提高效率。
其他想切换IP或者隐藏身份的场景也会用到代理IP,比如SEO等。
代理IP有开放代理也有私密代理,开放代理是全网扫描而来的,不稳定,不适合爬虫,如果自己随便用用还好。用爬虫抓数据,最好使用私密代理。私密代理网上有很多提供商,稳定性参差不齐,现在我们公司使用的是“百变IP”提供的私密代理。
我们公司有个项目是抓取亚马逊数据来进行分析销量、评论等,用PHP进行抓取,抓取亚马逊要特别注意header头,否则输出的数据就是空了。还有一种方法,可以用PHP通过shell_exec来调用curl命令来进行抓取。
PHP如果是使用curl函数来抓取,主要设置下面几项即可。 curl_setopt($ch, CURLOPT_PROXY, 'proxy.baibianip.com'); //代理服务器地址 curl_setopt($ch, CURLOPT_PROXYPORT, '8000'); //代理服务器端口 如果是抓取HTTPS,把下面两项设置为false: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //抓HTTPS可以把此项设置为false curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //抓HTTPS可以把此项设置为false
方法一:完整示例代码如下,下面提供两种方式来调用:
<?php //代理ip列表 const PROXY_LIST = [ '124.232.133.199:3128', '171.83.165.90:9999', ]; function curl_via_proxy($url,$proxy_ip,$headers = [],$user_agent = 'curl',$method = 'GET') { $arr_ip = explode(':',$proxy_ip); $ch = curl_init($url); //创建CURL对象 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_HEADER, 0); //返回头部 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回信息 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); //连接超时时间 curl_setopt($ch, CURLOPT_TIMEOUT, 5); //读取超时时间 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //对认证证书来源的检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //从证书中检查SSL加密算法是否存在 curl_setopt($ch, CURLOPT_PROXY, $arr_ip[0]); //代理服务器地址 curl_setopt($ch, CURLOPT_PROXYPORT, $arr_ip[1]); //代理服务器端口 curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); //添加头部信息 if(!empty($headers)){ curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } $res = curl_exec($ch); $curl_errno = curl_errno($ch); if ($curl_errno) { curl_close($ch); return false; } curl_close($ch); return $res; } $headers = array( 'authority:www.amazon.com', 'upgrade-insecure-requests:1', 'user-agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3355.4 Safari/537.36', 'accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'accept-encoding:gzip, deflate, br', 'accept-language:zh-CN,zh;q=0.9,en;q=0.8', ); $url = 'https://api.apiopen.top/recommendPoetry'; var_dump(curl_via_proxy($url,PROXY_LIST[array_rand(PROXY_LIST,1)],$headers)); die;
方式二:利用PHP调用Linux的curl命令来进行抓取,Windows下下载curl.exe即可。
$html = shell_exec("curl -x 'proxy.baibianip.com:8000' 'http://www.baidu.com' --connect-timeout 3 -m 5"); echo $html;
相关文章
- PHP防止网页快速刷新+代理ip访问
- php 采集爬取单个淘宝商品描述,商品属性
- php闭包函数简析
- 禁用PHP函数,可以对php.ini进行配置
- 配置php.ini实现PHP文件上传功能
- PHP常量PHP_SAPI与函数php_sapi_name()简介,PHP运行环境检测
- 谈谈PHP中require和include的区别
- PHP实现统计在线人数的方法
- PHP四大主流框架的优缺点总结
- PHP+Redis实现延迟任务,实现自动取消与完成订单
- go-micro+php+consul简单的微服实现
- php:使用XHProf查找PHP性能瓶颈
- php:PHP解析xml的4种方法
- dns未设置 PHP Warning: file_get_contents():php_network_getaddresses: getaddrinfo failed:
- php 提示Warning: mysql_fetch_array() expects
- 以源码编译的方式安装PHP与php-fpm
- PHP采集库-Snoopy.class.php
- php:用数组实现多语言(PHP 7.4.2)
- php类库PHP QR Code 二维码
- 在NGINX作反向代理,CI(CodeIgniter)的PHP框架下限制管理目录的IP的实现
- kill killall pkill 杀死php后台进程
- PHP在WIN下操作socket
- php之上传小案例,根据时间:月日分创建目录并随机生成文件名
- php批量打印发票三(php用FPDF合并所有图片为PDF文档)
- PHP中smarty与MYSQL数据库的连接
- CentOS8平台php日志的定时切分
- 烂泥:php5.6源码安装及php-fpm配置
- [PHP] Laravel 联查中对不同表字段关系加条件的方式
- [php-src] Php内核的有趣高频宏
- [php-src] Php扩展的多文件编译
- PHP Unit资料收集
- Atitit.jsou html转换纯文本 java c# php
- Atitit.实现反向代理(1)----url rewrite 配置and内容改写 and -绝对路径链接改写 java php
- paip.截取字符串byLastDot方法总结uapi python java php c# 总结
- win server 2008 r2 iis+php 500错误内部服务器错误。
- 【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)