昨天在爬取大众点评的时候,刚开始还好好的,但一会就把我的ip给封啦,所以我就想给自己弄一个ip池,这样我就可以继续爬啦。网上找了一堆代码,发现好多都是python2的,它们请求使用urllib2的库,这个库在python3中合并成urllib,所以很多方法调用都出现错误,所以我还是决定用requests。
一、获得代理ip
-
def get_ip_list(obj):
-
ip_text = obj.findAll(
'tr', {
'class':
'odd'})
# 获取带有IP地址的表格的所有行
-
ip_list = []
-
for i
in range(len(ip_text)):
-
ip_tag = ip_text[i].findAll(
'td')
-
ip_port = ip_tag[
1].get_text() +
':' + ip_tag[
2].get_text()
# 提取出IP地址和端口号
-
ip_list.append(ip_port)
-
print(
"共收集到了{}个代理IP".format(len(ip_list)))
-
print(ip_list)
-
return ip_list
-
url =
'http://www.xicidaili.com/'
-
headers = {
-
'User-Agent':
'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
-
request = Request(url, headers=headers)
-
response = urlopen(request)
-
bsObj = BeautifulSoup(response,
'lxml')
# 解析获取到的html
-
lists=get_ip_list(bsObj)
二、验证是否可用
-
def valVer(proxys):
-
badNum =
0
-
goodNum =
0
-
good=[]
-
for proxy
in proxys:
-
try:
-
proxy_host = proxy
-
protocol =
'https'
if
'https'
in proxy_host
else
'http'
-
proxies = {protocol: proxy_host}
-
response = requests.get(
'http://www.baidu.com', proxies=proxies, timeout=
2)
-
if response.status_code !=
200:
-
badNum +=
1
-
print (proxy_host,
'bad proxy')
-
else:
-
goodNum +=
1
-
good.append(proxies)
-
print (proxy_host,
'success proxy')
-
except Exception
as e:
-
print( e)
-
# print proxy_host, 'bad proxy'
-
badNum +=
1
-
continue
-
print (
'success proxy num : ', goodNum)
-
print(
'bad proxy num : ', badNum)
-
return good
三、检查代理ip是否可用
-
res =requests.get(
'http://icanhazip.com/', proxies=go[
0])
-
print (res.content)
注:我在找资料的时候我发现一个库fake_useragent,这个库可以伪装请求头,具体用法
-
from fake_useragent
import UserAgent
-
ua = UserAgent()
-
#ie浏览器的user agent
-
print(ua.ie)
-
-
#opera浏览器
-
print(ua.opera)
-
-
#chrome浏览器
-
print(ua.chrome)
-
-
#firefox浏览器
-
print(ua.firefox)
-
-
#safri浏览器
-
print(ua.safari)
-
-
#最常用的方式
-
#写爬虫最实用的是可以随意变换headers,一定要有随机性。支持随机生成请求头
-
print(ua.random)
-
print(ua.random)
-
print(ua.random)
这样就可以伪装自己。