python爬虫在爬取网页内容时,遭遇的最常见的反爬措施就是ip限制/封禁,对此最常见的解决方式就是设置IP代理池,每次请求时随机使用一个代理IP去访问资源。
网上有成熟的代理服务,但是小伙汁的爬虫需求多是非定期的自定义项目,使用付费代理并不划算,遂有了爬取免费代理并测试是否可用,进而构建一个可用代理IP池的想法。本项目亦可作为后续网络相关服务的子模块。
版本1:先通过request或者selenium进行爬取;版本2(大概率是鸽了~):学习并使用scrapy进行爬取,填上坑了,重构了在这儿;
经过在编码过程中不断的修修改改,重重构构,整体逻辑终于是有了一个相对解耦的模式,由于项目相比于大型项目来说还是justlikeatoy,所以核心模块就是一个通用的Spider父类模块,定义了整体的爬虫逻辑,其余针对特定网页的实例都继承自该Spider。先看图吧:
下面会详细的介绍每个模块的具体实现细节,再介绍之前,让我再bb几句吧。这个项目主要是出于个人兴趣,作为一个初入python爬虫领域的菜鸟,利用业余时间在拖拖拉拉中写完了这个项目,写的过程中也逐渐学习了一些python的高级语法,例如装饰器、自定义异常、多进程异步操作等,收获还是蛮多的。此外,由于免费代理资源本身并不是很稳定,指望通过免费代理资源来构建一个鲁棒的代理池还是有点困难的,所以这个项目更多的还是当学习使用。
这个模块一开始写得时候比较简单,但是在后续加入各种各样的实例爬虫后,为了解耦和鲁棒性,功能也在不断的完善,为了阅读方便,先上简单版本代码:
插播一下:上面我这里直接上了进程池的版本,本来一开始写得是串行验证,但是速度太慢了,所以果断换多进程并发。如果对python多进程不太熟悉,可以先停一会儿去这里看下相关知识,啪的一下很快的:
当爬取到代理时,需要验证其可用性,对可用代理才将其保存。一般来说,较为简单的验证逻辑就是使用该代理对百度首页进行访问,然后根据返回结果验证代理可用性。但是在实际使用过程中,会出现各种问题,比如代理访问并没有隐藏掉源ip、百度返回验证页面、无法访问但返回一个正常的说明网页(非百度首页)等。
所以这里采用的是使用代理对IP查询网站(/)进行访问,解析网页结果,判断网页显示的ip是否与所使用的代理ip一致:
pre_parse()用来获取代理资源页,但是seo没有,为了结构一致性,在其中直接填充详情页。