关于爬数据的一点点事情
由于项目需要,最近需要从网上爬数据,也因此对爬数据这一块进行了一些了解。
关于爬虫,主要说说在实验过程中几个重要的点
1.伪装浏览器访问
一开始没注意这个问题,导致多次访问不是很顺畅,有时候需要等待好久。作为一个纯真的小男孩,初始代码非常简单,就像下面这样直接建立连接,然后获得对应url的内容。
s = requests.Session()
connection = s.get(url)
后来,发现了上面所说的问题后,上网相关搜索了一下,对原有“纯真”的代码进行了改造,加了浏览器的一些元素,让代码在外部看起来更像人为正常的浏览器访问,而不是一个爬虫。具体改造如下
s = requests.Session() connection = s.get(url, headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" })
也就是加了headers中user-agent这个元素而已。具体user-agent可以从浏览器中的任意网页-->右键(检查)-->Network-->刷新-->选中一个js文件(中可以查看对应的request header),然后复制过来即可。
2.恰到好处的sleep和timeout
time.sleep()
这里的sleep函数是个好东西,因为当爬虫一直爬取人家数据的时候,稍微正常点的网站都会有一些防护的措施,当你被识别为爬虫等不明外来攻击者时,网站会拦截你的访问,这样你爬数据的目的就呵呵哒了。这时候就需要你每次访问之后有个适当的休息时间,因为人为访问最快也得有个频率的嘛,我们的目的就是要伪装成人为浏览器访问的样子。我本次实验的处理方法是在每次下载操作完成之后sleep一秒,这样的频率刚刚好满足网站的拦截频率。
try: connection = s.get(url, headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" }, timeout = 5) except Exception, e: print "downloading for more than 5s, so try again now..." continue
上面是加了timeout的爬取访问,这里为啥要加timeout呢,在实验过程中我发现目标网址在你一连串的访问之后有时会卡住(具体原因我倒没有细究过,也可能是网速问题卡住了吧)然后我们的实验程序就停止了,这时其实我们重新尝试连接时很快就可以访问下载的,所以这里很可能只是我们的程序卡住了而已,解决这一点我采用的是在访问目标网址的时候设置了一个timeout参数,让程序若在5秒之内未连接成功,自动尝试重新连接。
3.IP代理访问
当你使用sleep之后,你会发现下载还是比较顺畅的,成千上万的数据量随随便便就是时间的问题了。但是当你面临着几百几千万甚至上亿数据量要下载的时候,你就会觉得这要下到何年何月啊,要是有多几台服务器给我跑那该多好。这时候IP代理就应该出现了。所谓IP代理在这里的用处,我的理解是相当于我们把访问请求发给代理,代理再帮我们转发到我们的目标网址这样一来,访问目标网址的就是IP代理,而不是我们自己的IP。是不是看出有什么可以拓展的了?也就是说我们只要拥有多个稳定的IP代理,就可以相当于拥有很多个主机的样子,多台主机同时爬取数据,这速度比原先的就要快上个很多很多倍了(虽然我这次只是用多台主机在跑而已)。具体操作如下
PROXY = {'http':'http://120.77.255.133:8088'} ... connection = s.get(url, headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" }, proxies=PROXY, timeout = 5)
(至于IP代理如何获取,网上教程也挺多的,我之后也会写一篇关于这个问题的博客)
自己第一次写爬虫,探索探索,觉得爬虫好像也挺有意思的,就这样让一个程序代替了机械化的人为操作,还是有点成就感的。
以上也只是本次实验的一些心得体会,肯定有很多不足的地方,如各位大大看到哪里写错了,请一定指正告知,谢谢各位了~