欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

爬虫(二)建立代理ip池

程序员文章站 2022-04-23 16:30:44
之前我们说网站反爬虫的一个常用方法是检测ip,限制访问频率。所以我们要通过设置代理ip的办法绕过这个限制。有不少提供免费代理ip的网站,像https://www.xicidaili.com/nt/,我们可以从网站上拿到很多代理ip。但是这些ip并不是每个都能用的,或者说,没几个能用的。 我们可以用b ......

之前我们说网站反爬虫的一个常用方法是检测ip,限制访问频率。所以我们要通过设置代理ip的办法绕过这个限制。有不少提供免费代理ip的网站,像,我们可以从网站上拿到很多代理ip。但是这些ip并不是每个都能用的,或者说,没几个能用的。

 

我们可以用beautifulsoup分析网页,然后处理,提取代理ip列表,也可以用正则表达式进行匹配。用正则表达式会快一些。ip_url就是,random_hearder就是一个随机获得请求头的函数。

def download_page(url):
    headers = random_header()
    data = requests.get(url, headers=headers)
    return data


def get_proxies(page_num, ip_url):
    available_ip = []
    for page in range(1,page_num):
        print("抓取第%d页代理ip" %page)
        url = ip_url + str(page)
        r = download_page(url)
        r.encoding = 'utf-8'
        pattern = re.compile('<td class="country">.*?alt="cn" />.*?</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>', re.s)
        ip_list = re.findall(pattern, r.text)
        for ip in ip_list:
            if test_ip(ip):
                print('%s:%s通过测试,添加进可用代理列表' %(ip[0],ip[1]))
                available_ip.append(ip)
        time.sleep(10)print('抓取结束')
    return available_ip

拿到ip后我们还需要对ip进行检测,确定这个ip可以用。怎么检测呢?我们可以用代理ip访问一个能显示访问ip的网站,然后检查请求结果。

def test_ip(ip,test_url='http://ip.tool.chinaz.com/'):
    proxies={'http': ip[0]+':'+ip[1]}
    try_ip=ip[0]
    try:
        r=requests.get(test_url, headers=random_header(), proxies=proxies)
        if r.status_code==200:
            r.encoding='gbk'
            result=re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',r.text)
            result=result.group()
            print(result)
            if result[:9]==try_ip[:9]:print('%s:%s测试通过' % (ip[0],ip[1]))
                return true
            else:
                print('%s:%s 携带代理失败,使用了本地ip' %(ip[0],ip[1]))
                return false
        else:
            print('%s:%s 请求码不是200' %(ip[0],ip[1]))
            return false
    except exception as e:
        print(e)
        print('%s:%s 错误' %(ip[0],ip[1]))
        return false

有些教程只是拿到200的http状态码就认为成功了,这是不对的。因为代理ip访问不成功,就会默认使用你自己的ip。用我自己的ip访问当然能成功了。

 

最后拿到的ip在使用前我们还需要对其进行检测,因为你不知道什么时候它就不可用了。所以平时多储存一些代理ip,免得要用的时候没得用。

 

这篇文章的代码参考了https://blog.csdn.net/xrrrick/article/details/78650764,我稍微做了一些修改。