在日常爬取网站的时候,我们经常会遇到一个问题,就是很多网站上都部署了反爬虫机制,当服务器检测到一段时间内同一个 IP 持续密集的访问网站,则将其判定为爬虫程序,在一段时间内不允许该 IP 地址访问服务器。
如果平时没什么事儿的话,可以写个延迟函数,每爬一次随机歇个几秒钟,这样可以很有效的降低访问密度,从而避开反爬机制。但是,这样的话太浪费时间了,几万条数据可能要爬一整天。对于一些公司业务来说是需要更加有效率的爬取数据,所以遇到这种情况可以使用代理 IP 和随机 UA(User-Agent)。说白了就是伪装爬虫,假装不同的人使用不同的浏览器在访问网站。
关于随机UA,即 User-Agent ,使用它可以将我们的爬虫伪装成浏览器,让对方以为是真人在使用浏览器访问,从而骗过目标网站的反爬机制。但是使用固定的 UA 去爬也是会有问题的,你想嘛,假如你发现最近几个小时内来访问的几万个用户,用的都是同一个浏览器,你还会认为对面是真人吗?不封它封谁!
所以,为了让我们的爬虫更像真人在使用,我们不仅要为它设置 UA,还要使用随机 UA(让对方服务器开心的以为有好多的用户在访问呢)。
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/548.39 (KHTML, like Gecko) Chrome/104.0.234 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/598.45 (KHTML, like Gecko) Chrome/103.0.2647 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/585.54 (KHTML, like Gecko) Chrome/92.0.2667 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/585.52 (KHTML, like Gecko) Chrome/93.0.2005 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.70
Mozilla/5.0 (Windows NT 9_1_2; Win64; x64) AppleWebKit/600.48 (KHTML, like Gecko) Chrome/95.0.1729 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.99 Vulcan/0.3.0.1 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.74 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.78
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.182.400 QQBrowser/11.3.5182.400
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.168.400 QQBrowser/11.0.5120.400
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) tcs_app/3.7.3 Chrome/94.0.4606.81 TCS/3.7.3 TTTCS/3.7.3 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.39
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.105 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4482.0 Safari/537.36 Edg/92.0.874.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3.1 Safari/605.1.15
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36 Edg/93.0.961.52
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/567.48 (KHTML, like Gecko) Chrome/93.0.1941 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/550.45 (KHTML, like Gecko) Chrome/88.0.960 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.42 (KHTML, like Gecko) Chrome/93.0.2048 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x6309001c) XWEB/6500
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36 (compatible; SMTBot/1.0; http://www.similartech.com/smtbot)
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.343.0 Safari/533``
`
关于代理IP,这个就是大家熟悉的不能再熟悉的问题了,要想高效的获取数据肯定是需要高质量的代理,这个只能通过购买代理服务,我想作为爬虫大家肯定也用过不少的代理了,好的坏的都有一定的了解。如果没有什么好的代理可以选择的,这里推荐一家老代理商,亿牛云代理,已经合作了很多年,代理稳定性和质量一直都很好,售后也是很不错的。尤其推荐他们家的爬虫隧道代理,不知道隧道代理怎么使用的,这里可以简单的示例大家参考下。
示例中使用的方法亲测可用,但是代码并非全部源码,不保证代码可以直接复制粘贴使用,建议大家理解原理之后,根据自己的爬虫项目需要进行相应的调整或直和商家联系提供完整代码示例。
import requests
import random
# 要访问的目标页面
targetUrl = "http://httpbin.org/ip"
# 要访问的目标HTTPS页面
# targetUrl = "https://httpbin.org/ip"
# 代理服务器(产品官网 www.16yun.cn)
proxyHost = "t.16yun.cn"
proxyPort = "31111"
# 代理验证信息
proxyUser = "username"
proxyPass = "password"
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
"host" : proxyHost,
"port" : proxyPort,
"user" : proxyUser,
"pass" : proxyPass,
}
# 设置 http和https访问都是用HTTP代理
proxies = {
"http" : proxyMeta,
"https" : proxyMeta,
}
# 设置IP切换头
tunnel = random.randint(1,10000)
headers = {"Proxy-Tunnel": str(tunnel)}
resp = requests.get(targetUrl, proxies=proxies, headers=headers)
print resp.status_code
print resp.text