Python爬虫代理

为什么使用代理

在爬取网站信息的过程中,有些网站为了防止爬虫,可能会限制每个ip的访问速度或访问次数。对于限制访问速度的情况,我们可以通过time.sleep进行短暂休眠后再次爬取。对于限制ip访问次数的时候我们需要通过代理ip轮换去访问目标网址。

从哪里获取代理IP

付费获取代理IP,或者通过爬取免费代理的网站网站获取代理IP,有如下可以免费获取代理IP的网站
快代理、代理66、有代理、西刺代理、guobanjia、国内高匿代理IP

如何保证代理质量

由于免费代理IP大部分不能用,所以采集回来的代理IP不能直接使用,可以写检测程序不断的去用这些代理访问一个稳定的网站,看是否可以正常使用。这个过程可以使用多线程或异步的方式,因为检测代理是个很慢的过程。

基本流程

1.从代理网站爬取代理IP(本次爬取国内高匿代理,网址https://link.jianshu.com/?t=http%3A%2F%2Fwww.xicidaili.com%2Fnn%2F
2.将爬取的代理IP保存至本地txt文档
3.遍历文档,用代理IP访问常用网址剔除不可用和质量低的代理IP

  • 使用多线程爬取高匿代理前10页的代理IP并保存至桌面ip_list.txt文档
import threading
import os
import requests
from bs4 import BeautifulSoup
import re 
def get_proxy(num):
    os.chdir(r'C:\Users\Administrator\Desktop')
    f = open('ip_list.txt','a',encoding='utf-8')
    urls = ['http://www.xicidaili.com/nn/%i' %i for i in range(num+1)] 
    headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
    for url in urls:
        response = requests.get(url,headers = headers)
        soup = BeautifulSoup(response.text,"lxml")
        ip_info = soup.find_all('tr',class_='odd')
        try:
            for i in ip_info:
                ip = i.find_all('td')[1].text
                port = i.find_all('td')[2].text
                proxy = ip + ':' + port +'\n' 
                f.write(proxy)
        except Exception as e:
            print('NO IP')
    f.close()
t = threading.Thread(target=get_proxy,args=(10,))
t.start()
t.join()
  • 对保存至桌面文档的代理IP进行测试,将测试能够达到要求的ip添加至proxys_list列表
proxys_list = []
def test_proxy():
    os.chdir(r'C:\Users\Administrator\Desktop')
    f = open('ip_list.txt','r',encoding='utf-8')
    pros = f.readlines()
    url = 'https://www.baidu.com/'
    headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
    for pro in pros:
        proxy = ('http://'+ pro).strip('\n')
        proxies = {'proxy':proxy}
        print(proxies)
        try:
            response = requests.get(url,headers = headers,proxies = proxies)
        except Exception as e:
            pass
        else:
            code = response.status_code
            if code >= 200 and code < 300:
                proxys_list.append(proxies)
            else:
                continue
    return(proxys_list)
t2 = threading.Thread(target=test_proxy)
t2.start()
t2.join()
有没有构建好的代理池

有,项目地址

ProxyPool

项目说明文档

如何构建一个代理池

代理池流程

安装Python

至少Python3.5以上

安装Redis

安装好之后将Redis服务开启

配置代理池

cd proxypool

进入proxypool目录,修改settings.py文件

PASSWORD为Redis密码,如果为空,则设置为None

安装依赖

pip3 install -r requirements.txt

打开代理池和API

python3 run.py

获取代理

利用requests获取方法如下

import requests

PROXY_POOL_URL = 'http://localhost:5555/random'

def get_proxy():
    try:
        response = requests.get(PROXY_POOL_URL)
        if response.status_code == 200:
            return response.text
    except ConnectionError:
        return None

你可能感兴趣的:(Python爬虫代理)