python中的代理问题

2018-07-15  本文已影响90人  K同学啊

在爬虫的世界里我们经常会遇到反爬虫机制,其表现就是经常被提示爬取错误、无法连接服务器等等。

1、设置代理IP

1.1、 环境

1.2、代码展示

可以直接copy运行(环境得配好)

# IP地址取自国内髙匿代理IP网站:http://www.xicidaili.com/nn/  
#作者博客:明天依旧可好
from bs4 import BeautifulSoup  
import requests  
import random  
#功能:爬取IP存入ip_list列表  
def get_ip_list(url, headers):  
    web_data = requests.get(url, headers=headers)  
    soup = BeautifulSoup(web_data.text, 'lxml')  
    ips = soup.find_all('tr')  
    ip_list = []  
    for i in range(1, len(ips)):  
        ip_info = ips[i]  
        tds = ip_info.find_all('td')  
        if not tds[8].text.find('天')==-1:  
            ip_list.append(tds[1].text + ':' + tds[2].text)  
    return ip_list  
  
#功能:1,将ip_list中的IP写入IP.txt文件中  
#      2,获取随机IP,并将随机IP返回  
def get_random_ip(ip_list):  
    proxy_list = []  
    for ip in ip_list:  
        proxy_list.append('http://' + ip)  
        f=open('IP.txt','a+',encoding='utf-8')  
        f.write('http://' + ip)  
        f.write('\n')  
        f.close()  
    proxy_ip = random.choice(proxy_list)  
    proxies = {'http': proxy_ip}  
    return proxies  
  
if __name__ == '__main__':    
    for i in range(1,50):
        url = 'http://www.xicidaili.com/wt/{}'.format(i) 
        headers = {  
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'  
        }  
        ip_list = get_ip_list(url, headers=headers)  
        proxies = get_random_ip(ip_list)  
        print(proxies)  
  1. 函数get_ip_list(url, headers)传入url和headers,最后返回一个IP列表,列表的元素类似203.174.112.13:3128格式,这个列表包括国内髙匿代理IP网站首页所有IP地址和端口。
  2. 函数get_random_ip(ip_list)传入第一个函数得到的列表,返回一个随机的proxies,这个proxies可以传入到requests的get方法中,这样就可以做到每次运行都使用不同的IP访问被爬取的网站,有效地避免了真实IP被封的风险。proxies的格式是一个字典:{‘http’: ‘http://203.174.112.13:3128‘}。

1.3、代码备注

国内高匿代理IP这个网站上提供了大量的ip地址,我们可以抓取下来供爬虫使用

image.png

不足是这里的ip参差不齐,需要我们爬取过程中进行筛选,我上面代码提取的都是存活了一天以上的ip。可以根据需要对ip进行进一步筛选。

1.4、代理IP的使用

运行上面的代码会得到一个随机的proxies,把它直接传入requests的get方法中即可。

req = requests.get(url, headers=headers, proxies=proxies)

2、不断更换的User-Agent

在爬取量庞大时,仅仅更换ip是不够的,我在给英文取名这个小程序爬取数据时,就遇到这个问题,当时的爬取量都是以万为单位的,我就不断升级ip的质量的同时提高了ip的更换频率以及加长中间的时间间隔,无奈还是被反爬虫机制所识别。

2.1、fake_useragent包

通过pip安装fake_useragent

pip install fake_useragent

使用

from fake_useragent import UserAgent

headers = {'User-Agent':str(UserAgent().random)}
req = requests.get(url=url,headers=headers,proxies=proxies)
上一篇 下一篇

猜你喜欢

热点阅读