在爬虫的世界里我们经常会遇到反爬虫机制,其表现就是经常被提示爬取错误、无法连接服务器等等。
1、设置代理IP
1.1、 环境
- 安装requests库
- 安装bs4库
- 安装lxml库
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)
- 函数get_ip_list(url, headers)传入url和headers,最后返回一个IP列表,列表的元素类似203.174.112.13:3128格式,这个列表包括国内髙匿代理IP网站首页所有IP地址和端口。
- 函数get_random_ip(ip_list)传入第一个函数得到的列表,返回一个随机的proxies,这个proxies可以传入到requests的get方法中,这样就可以做到每次运行都使用不同的IP访问被爬取的网站,有效地避免了真实IP被封的风险。proxies的格式是一个字典:{‘http’: ‘http://203.174.112.13:3128‘}。
1.3、代码备注
国内高匿代理IP这个网站上提供了大量的ip地址,我们可以抓取下来供爬虫使用

不足是这里的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)
网友评论