在python 数据爬取的时候,有些网站不会同意我们直接用爬虫访问爬取,如果识别是一个爬虫在访问,那么站点根本不会响应。不仅如此,当服务器觉得一个频繁的请求是来自于同一个IP地址发出的,服务器也会对IP进行限制访问。

针对以上问题,我们也有相应的方法应对:

1.对于服务器的爬虫识别问题,我们可以利用User-Agent标识将爬虫伪装成用户请求。

2.对于限制ip 的问题,我们可以使用代理ip ,随机切换IP地址,不使用真实的IP来发起请求。

获取随机ip 和User-Agent 的文件 random_ip_and_header.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import random
import requests
from bs4 import BeautifulSoup
import random


class get_xici_ip():
# 尝试代理agents增强反反爬
def random_agent(self):
user_agents = [
"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_2 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5",
"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5",
"MQQBrowser/25 (Linux; U; 2.3.3; zh-cn; HTC Desire S Build/GRI40;480*800)",
"Mozilla/5.0 (Linux; U; Android 2.3.3; zh-cn; HTC_DesireS_S510e Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 NokiaE75-1 /110.48.125 Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413"
'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11'
]
return random.choice(user_agents)

# 尝试代理IP增强反反爬
def get_ip_list(self, 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')
ip_list.append(tds[1].text + ':' + tds[2].text)
return ip_list

def get_random_ip(self, ip_list):
proxy_list = []
for ip in ip_list:
proxy_list.append('http://' + ip)
proxy_ip = random.choice(proxy_list)
proxies = {'http': proxy_ip}
return proxies

def get_one(self):
url = 'http://www.xicidaili.com/nn/%s'%random.randint(1,10)
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 = self.get_ip_list(url, headers=headers)
print(ip_list)
return self.get_random_ip(ip_list)
if __name__ == '__main__':
print(get_xici_ip().random_agent())
print("\n")
print(get_xici_ip().get_one())

本文件可直接使用获取,也可供其他文件调用实现随机 ip 和 header 访问。

在爬虫文件中设置以下配置。

1
2
3
4
5
6
7
8
9
from random_ip_and_header import get_xici_ip

User_Agent = get_xici_ip().random_agent()
proxy = get_xici_ip().get_one()
header = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': User_Agent
}

并为请求访问设置指定headers 和proxies 便可进行匿名访问。

1
requests.get(url,headers=header,proxies=proxy)

如此设置便可大大提高数据爬取速度,但是要记得,数据爬取会给服务器带来很大的压力,我们也要设置好爬取时间间隔,最好是在夜深人静的时候进行爬取,避免给服务器造成困扰哦。