c语言编程笔录

您现在的位置是:首页 > 编程 > 编程经验

编程经验

使用PHP实现随机获取代理IP的爬虫

陈婉璇 2023-07-11编程经验
背景说明爬虫开发是互联网数据抓取的方法之一,通过爬取相应网站的页面,获取需要的数据。但是,有些网站会限制爬虫的IP,因此需要使用代理IP进行爬虫。在爬虫中,代理IP是非常重要的资源,影响爬虫的

背景说明

爬虫开发是互联网数据抓取的方法之一,通过爬取相应网站的页面,获取需要的数据。但是,有些网站会限制爬虫的IP,因此需要使用代理IP进行爬虫。在爬虫中,代理IP是非常重要的资源,影响爬虫的效率和准确性。为了实现随机获取代理IP的爬虫,可以使用PHP编写代码,下面将提供具体的方案。

方案分析

在PHP中使用代理IP进行爬虫,需要先获取代理IP,然后使用代理IP进行访问。如何获取代理IP呢?可以使用一些提供代理IP的网站,比如:http://www.xiladaili.com/、https://www.kuaidaili.com/等。这些网站提供了代理IP的列表,可以通过解析获取IP。为了提高获取代理IP的成功率,可以通过多次请求的方式,不断尝试获取。下面是获取代理IP的代码:


/**
  * 获取代理IP
  * return 代理IP数组
  */
function getProxyIp()
{
    //代理IP获取网址
    $url = 'http://www.xiladaili.com/putong/';

    //使用cURL获取网页内容
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);//网址
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//返回字符串
    curl_setopt($ch, CURLOPT_HEADER, 0);//不显示头信息
    $pageContent = curl_exec($ch);//执行cURL请求
    curl_close($ch);//关闭cURL请求
    
    //解析代理IP
    $ipPattern = '/(\d+\.\d+\.\d+\.\d+)\:(\d+)/';
    preg_match_all($ipPattern, $pageContent, $matches);
    if ($matches[0]) 
    {
        $proxyIp = array_combine($matches[1], $matches[2]);//将IP和端口组合为键值对数组
        return $proxyIp;
    } 
    else 
    {
        return false;
    }
}

使用代理IP进行爬虫

获取代理IP后,就可以使用代理IP进行爬虫。使用cURL可以指定代理IP进行访问。cURL是一种用于传输数据的工具,支持HTTP、HTTPS、FTP等协议,使用很方便。下面是使用代理IP进行爬虫的代码:


/**
  * 使用代理IP进行爬虫
  * @param string $url 爬取的网址
  * @param array $proxyIp 代理IP数组
  * @return string 返回爬取的网页内容
  */
function getHtmlWithProxy($url, $proxyIp)
{
    $keys = array_keys($proxyIp);
    shuffle($keys);//随机排序
    $proxyIp = array_intersect_key($proxyIp,array_flip($keys));//重新排序

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_PROXY, array_shift($proxyIp));//从代理IP数组中取出一个IP
    curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);//使用HTTP协议代理
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);//返回字符串
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);//跟随重定向
    curl_setopt($curl, CURLOPT_URL, $url);//网址
    curl_setopt($curl, CURLOPT_TIMEOUT, 15);//超时时间
    curl_setopt($curl, CURLOPT_HEADER, FALSE);//不显示头信息
    $result = curl_exec($curl);//执行cURL请求
    curl_close($curl);//关闭cURL请求
    return $result;
}

随机获取代理IP进行爬虫

为了提高爬虫效率,可以在每次请求时随机获取一个代理IP进行访问。下面是完整的随机获取代理IP进行爬虫的代码:


/**
  * 获取随机代理IP进行爬虫
  * @param string $url 爬取的网址
  * @return string 返回爬取的网页内容
  */
function getHtmlWithRandomProxyIp($url)
{
    $proxyIp = getProxyIp();

    if ($proxyIp === false) 
    {
        return false;
    }

    $keys = array_keys($proxyIp);
    shuffle($keys);//随机排序
    $proxyIp = array_intersect_key($proxyIp,array_flip($keys));//重新排序

    foreach ($proxyIp as $ip => $port) 
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_PROXY, $ip);//从代理IP数组中取出一个IP
        curl_setopt($curl, CURLOPT_PROXYPORT, $port);//端口
        curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);//使用HTTP协议代理
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);//返回字符串
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);//跟随重定向
        curl_setopt($curl, CURLOPT_URL, $url);//网址
        curl_setopt($curl, CURLOPT_TIMEOUT, 15);//超时时间
        curl_setopt($curl, CURLOPT_HEADER, FALSE);//不显示头信息
        $result = curl_exec($curl);//执行cURL请求
        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);//获取HTTP状态码
        $errorNo = curl_errno($curl);//获取cURL错误码
        if ($httpCode == 200 && $errorNo == 0) 
        {
            return $result;
        }
    }

    return false;
}

文章评论