昨天在爬取大众点评的时候,刚开始还好好的,但一会就把我的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)
这样就可以伪装自己。