用户代理与IP代理爬取糗事百科
- 本文通过用户代理池和IP代理池的联和使用来爬取网页
一、情况分析
绝大多数的网站都具备反爬功能。而我们要爬取数据必须绕过这关。
如果短时期内频繁的爬取网站数据,极易被发现。人对网站的正常访问速度是有限的,因此爬虫就变得更容易暴露。
上网的用户会被分配给一个唯一的IP地址。因此通过对这个IP的监控,也极容易发现是爬虫在爬取网页。
二、解决思路
既然网站拒绝爬虫的标识,我们可以让爬虫伪装成不同的浏览器。浏览器种类越多越好。
既然IP地址是唯一的,我们可以想办法每次用不同的IP代理地址爬取。这样,对方就不太容易能够发现爬虫的行为。
三、实现代码
import urllib.request
import re
import urllib.error
import random
#构建IP代理池,IP可以到免费网站或者付费网站获取代理IP
ippools = [
"42.123.77.119",
"116.226.90.12",
"139.224.237.33",
"58.209.151.126"
]
#构建用户代理池
uapools = [
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon/3.0)",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; QIHU 360EE)",
]
def ip_ua(ippools,uapools):
headers = ("User-Agent",random.choice(uapools))
thisip = random.choice(ippools)
print("当前使用IP:"+str(thisip))
#添加IP代理
proxy = urllib.request.ProxyHandler({"http":thisip})
opener = urllib.request.build_opener(proxy,urllib.request.ProxyHandler)
#添加头文件
opener.addheaders = [headers]
#安装为全局
urllib.request.install_opener(opener)
try:
for i in range(0,4):
try:
ip_ua(ippools,uapools)
url = "http://www.qiushibaike.com/8hr/page/"+str(i)+"/?s=4985364"
data = urllib.request.urlopen(url).read().decode('utf-8')
pat = '<div class="content">\s*?<span>(.*?)</span>'
rst = re.compile(pat).findall(data)
for j in range(0,len(rst)):
print(rst[j])
print("........")
except urllib.request.HTTPError as err:
if hasattr(err, 'code'):
print(err.code)
if hasattr(err, 'reason'):
print(err.reason)
except Exception as err:
print("出现异常:"+str(err))
四、注意事项
由于IP的变动性,通常其使用寿命不长。如果需要持久的使用,需要选择优质的代理IP。