Python爬虫入门,快速抓取大规模数据(第五部分)

通过前面几部分我们已经可以写出一个简单的爬虫了。不幸的是,如果连续运行它一段时间你就会发现,爬虫已经被网站封掉了。通常网站都会有一定的反爬虫策略,以避免爬虫给网站带来太大的负载。而我们前面的爬虫示例中,我们每秒就抓取一张网页,过于频繁的抓取已经触发了网站的反爬虫机制。
这一部分里我们主要讨论一下如何避免触发网站的反爬虫机制,当然我们在实现我们自己的爬虫时也应该考虑如何避免给网站带来太大的影响。反爬虫的基本原理很简单,从所有网站访问请求中识别出爬虫发出的访问请求并阻止这些请求。所以要避免触发网站的反爬虫机制,就要使我们爬虫抓取请求尽量和正常用户请求一致。

基于HTTP请求特征的反爬虫

这种反爬虫策略就是根据单个请求的特征(如User-Agent等)来决定是否允许访问。默认情况下不同的浏览器和不同的工具生成HTTP请求时会设置不同的User-Agent。这种类型的反爬虫措施是很容易绕过,我们可以设置爬虫请求的User-Agent和其它需要的HTTP请求头,这样爬虫发出的请求就和浏览器发出的请求完全一样,成功的避免触发这一类的反爬虫措施。

下面的代码分别对应设置python requests和phantomjs请求的user-agent。

# 设置requests的User-Agent
url = "https://blog.csdn.net/nj_kevin_peng"
headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko)"}

requests.get(url, headers = headers)
# 设置phantomjs的User-Agent

dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko)")

browser = webdriver.PhantomJS(executable_path = path_phantomjs,service_args = args, desired_capabilities = dcap)

这里不得不推荐一下Fiddler这个工具。通过Fiddler抓包观察,我们可以清楚的看到从我们机器上发出的HTTP请求。我可以比较一下我们爬虫发出的HTTP请求和从浏览器发出HTTP请求是否有区别。如果需要,修改爬虫使发出的HTTP请求和浏览器发出的请求尽量一致。

基于HTTP访问请求统计的反爬虫

网站统计从各个IP地址发出的访问请求数量,如果达到一定的阀值就会触发反爬虫策略。这一类策略无法简单的绕过,所以我们需要做到的就是不要从单个IP地址发出太多访问请求,拉长同一网站两次抓取之间的时间间隔。另外,从多个不同IP地址发出访问请求。具体处理方法包括:

使用代理服务器

python requests允许设置代理服务器,这样我们的抓取HTTP请求就会从代理服务器发出,而网站看到的是代理服务器的地址。我们可以搭建代理服务器池,通过使用代理服务器来抓取。网络上也可以找到很多免费的代理服务器,但是稳定性可能是一个问题。
下面的代码分别对应设置python requests和phantomjs使用代理服务器。

# 设置requests使用代理服务器x.x.x.x

proxies = { "http": "http://x.x.x.x", "https": "http://x.x.x.x:8080" }  
requests.get("https://blog.csdn.net/nj_kevin_peng", proxies = proxies)
# 设置PhantomJs使用代理服务器x.x.x.x

args = ["--proxy=x.x.x.x","--proxy-type=http"]
browser = webdriver.PhantomJS(executable_path = path_phantomjs,service_args = args, desired_capabilities = dcap)

image

分布式爬虫

另一种选择是分布式爬虫,爬虫程序被部署在不同的机器上,每一台爬虫机器拥有不同的IP地址,并且每个爬虫以比较大的时间间隔抓取取据。
以前面我们实现的爬虫为例,我们可以部署一台MySQL数据库,然后把我们的爬虫运行于不同的机器上,不同的爬虫共享MySQL数据存储。
image

总结

通过这部分的内容我们的爬虫可以真正的运行起来采集数据了。在这个爬虫的基础上我们可以做更多很多的改进。不管怎样,爬虫的基本原理就是我们已经讨论过的内容,这个简单的爬虫可以帮助我们理解爬虫的本质。
在接下来的部分里我们将会看看现有的一些python的爬虫框架的实现。

往期文章:
Python爬虫入门,快速抓取大规模数据
Python爬虫入门,快速抓取大规模数据(第二部分)
Python爬虫入门,快速抓取大规模数据(第三部分)
Python爬虫入门,快速抓取大规模数据(第四部分)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值