Python爬虫小记

python

曾专职做过短期的Java爬虫工程师,涉及的工作是在既有框架的基础上进行业务开发。然而一叶障目只见树木不见森林,为了给日后的图像识别机器学习提供足够的学习样本数据,决定系统性深入学习下爬虫,而爬虫界血统更纯正或者说更有名的是Python爬虫,于是便成此文。

初入Python便有个大坑,2.x和3.x两个版本并存也算Python社区的一大特色吧,建议使用2.x的版本,一是通常默认服务器都安装了2.x的版本,二则有些Python库或者框架对3.x版本的支持还不是特别得好。学习爬虫除了Python的基本语法,正则表达式、基本的网络协议、数据存储等基础知识都是需要提前了解的。Python中有大量好用的库可以帮助我们提高开发效率,常用的包管理工具是pip。re用于处理正则,os涉及文件和目录操作等与操作系统相关的功能,multiprocessing用于多进程处理,urllib、urllib2、Requests用于处理网络操作,lxml、BeautifulSoup、PyQuery用于html页面的解析,另外常用的库还有json、datetime、logging等。爬取的html页面有多种解析方式,可以使用正则表达式、xpath、dom对象操作等,综合比较个人觉得处理大段标签PyQuery比较顺手,它使用类似jQuery选择器的语法,处理小段文字的精细工作还是正则表达式比较强大。常用的爬虫框架有PySpider和Scrapy,其中PySpider为国人开发,html页面解析基于PyQuery,而且还提供了可视化管理界面。使用PySpider遇到的问题包括:管理界面进行开发调试不是很方便,爬虫业务逻辑需要调整但直接修改原任务无效,只能清数据重建任务。

此外爬虫还有些行业固有的问题,比如:IP反爬虫、验证码、js动态渲染页面以及html页面插件、多线程、分布式、cookie和session保持等,需要采取相应的解决办法。IP反爬虫可以采用自建动态代理池的办法应对,代理源可以从免费代理网站抓取,也可以从某宝上买付费的代理,可以购买ADSL拨号服务器定时拨号获取动态IP,还可以利用翻墙的服务器结合Tor网络实现IP更换。图片验证码可以使用OCR编程识别,或者购买专业打码平台提供的API;滑块验证码只能通过动态IP或cookie保持等方式绕过;短信验证码可以使用手机验证码接码平台解决。js动态渲染页面可以使用PhantomJS无界面浏览器结合Selenium自动化测试框架或者爬虫框架来解决,html页面插件如:Flash、ActiveX、Java applet等也可以尝试用该办法解决。Python的设计问题导致其多线程就是个鸡肋,推荐使用多进程进行开发以提升爬虫效率,结合Redis和Scrapy可以实现分布式爬虫,爬虫框架通常也自带cookie和session保持的工具。另外,有些产品的移动端APP相较于WEB端反爬虫防护较弱,可以抓包API作为备用的突破口,但是如果APP进行了安全加固、API验证签名和时间戳进行防重放、API结果加密等措施也会使爬虫难度陡增。

玩爬虫是枯燥的,枯燥是因为往往我们需要做很多重复琐碎的工作,需要每天和正则为伴,需要考虑爬虫的健壮性,需要随时面对网站的改版。玩爬虫又是有趣的,有趣是因为它可以帮助我们完成一个人的精力无法完成的任务,让我们可以做有更多想象空间的事,可以每天迎接不同的挑战与反爬虫技术斗智斗勇,可以体味坐等结果一切尽在掌握的快感。

总之,恨一个人让他去学爬虫吧,爱一个人也让他去学爬虫吧。