zoukankan      html  css  js  c++  java
  • php 使用代理IP进行数据抓取

    什么是代理?什么情况下会用到代理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;
  • 相关阅读:
    Configuration Error <providerOption name="CompilerVersion" value="v3.5"/>
    destoon3.0 用户模板首页应用新模板无效不能立即刷新的解决方法
    改变kingcms默认拼音路径格式/修改kingcms拼音路径
    VB正则表达式
    kingcms 友情链接中 设置为推荐 取消推荐 设置为头条 取消头条,以及设置为up的bug
    kingcms5部分BUG修复和修改技巧
    SqlServer 函数 大全
    图文讲解NTFS和FAT32硬盘下 asp.net 生成word 错误: 80070005 和 错误:8000401a 的解决方法
    destoon3.0 后台公司模板 安装新模板提示“CSS文件不存在”及其解决方法
    asp.net报错:“System.NullReferenceException: 未将对象引用设置到对象的实例”
  • 原文地址:https://www.cnblogs.com/-mrl/p/10688433.html
Copyright © 2011-2022 走看看