小白爬虫之健壮的小爬虫

通常来讲咱们会遇到网站反爬虫策略下面几点:python

  1. 限制IP访问频率,超过频率就断开链接。(这种方法解决办法就是,下降爬虫的速度在每一个请求前面加上time.sleep;或者不停的更换代理IP,这样就绕过反爬虫机制啦!)
  2. 后台对访问进行统计,若是单个userAgent访问超过阈值,予以封锁。(效果出奇的棒!不过误伤也超级大,通常站点不会使用,不过咱们也考虑进去
  3. 还有针对于cookies的 (这个解决办法更简单,通常网站不会用)

咱们今天就来针对一、2两点来写个下载模块、别惧怕真的很简单。正则表达式

首先,此次咱们须要用到Python中的 re模块来提取内容浏览器

首先照常咱们须要下面这些模块:服务器

requestscookie

re(Python的正则表达式模块)dom

random(一个随机选择的模块)函数

都是上一篇文章装过的哦!re 和random是Python自带的模块,不须要安装测试

首先按照惯例咱们导入模块:网站

import requests
import re
import random

咱们的思路是先找一个发布代理IP的网站(百度一下不少的!)从这个网站爬取出代理IP 用来访问网页;当本地IP失效时,开始使用代理IP,代理IP失败六次后取消代理IP。下面咱们开整ヽ(●-`Д´-)ノui

首先咱们写一个基本的请求网页并返回response的函数:

哈哈 简单吧!

这只是基本的,上面说过啦,不少网站都都会拒绝非浏览器的请求的、怎么区分的呢?就是你发起的请求是否包含正常的User-Agent 这玩意儿长啥样儿?就下面这样(若是不同 请按一下F5)

QQ截图20161029205637

requests的请求的User-Agent 大概是这样 python-requests/2.3.0 CPython/2.6.6 Windows/7  这个不是正常的User-Agent、因此咱们得本身造一个来欺骗服务器(requests又一个headers参数能帮助咱们假装成浏览器哦!不知道的 必定是没有看官方文档!这样很很差诶!o(一︿一+)o),让他觉得咱们是真的浏览器。

上面讲过有的网站会限制相同的User-Agent的访问频率,那咱们就给他随机来一个User-Agent好了!去百度一下User-Agent,我找到了下面这些:

下面咱们来改改上面的代码成这样:

各位能够本身实例化测试一下,headers会不会变哦ε=ε=ε=(~ ̄▽ ̄)~

好啦下面咱们继续还有一个点没有处理:那就是限制IP频率的反爬虫。

首先是须要获取代理IP的网站,我找到了这个站点 http://haoip.cc/tiqu.htm(这儿原本我是准备教你们本身维护一个IP代理池的,不过有点麻烦啊!还好发现这个代理站,仍是这么好心的站长。我就能够光明正大的偷懒啦!ヾ(≧O≦)〃嗷~)

咱们先把这写IP爬取下来吧!原本想让你们本身写,不过有用到正则表达式的,虽然简单,不过有些怕是不会使。我也写出来啦.

咱们来打印一下看看

QQ截图20161029235128

下面[————–]中的内容就咱们添加进iplist这个初始化的list中的内容哦!

完美!!好啦如今咱们把这段代码加到以前写的代码里面去;并判断是否使用了代理:

须要测试的,能够自行测试哦。

下面我开始判断何时须要 !须要使用代理,并且还得规定一下多少次切换成代理爬取,多少次取消代理啊!咱们改改代码,成下面这样:

上面代码添加了一个timeout (防止超时)、一个num_retries=6(限制次数,6次事后使用代理)。

下面咱们让使用代理失败6次后,取消代理,直接上代码:

收工一个较为健壮的下载模块搞定(固然一个健壮的模块还应该有其它的内容,好比判断地址是不是robots.txt文件禁止获取的;错误状态判断是不是服务器出错,限制爬虫深度防止掉入爬虫陷进之类的····)

不过我怕太多你们消化不了,并且咱们通常遇到的网站基本不会碰到爬虫陷阱(有也不怕啊,反正规模不大,本身也就注意到了。)

下面咱们来把这个下载模块使用到咱们上一篇博文的爬出红里面去!

用法很简单!ヾ(*´▽‘*)ノ将这个py文件放在和上一篇博文爬虫相同的文件夹里面;并新建一个__init__.py的文件。像这样:

在爬虫里面导入下载模块便可,class继承一下下载模块;而后替换掉上一篇爬虫里面的所有requests.get,为download.get便可!还必须加上timeout参数哦!废话很少说直接上代码:

好了!搞完收工!你们能够看一下和上一次咱们写的爬虫有哪些变化就知道咱们作了什么啦!

 

更新:今天作教程的时候发现我忽略了一个问题,上面的写法,属于子类继承父类,这种写法 子类无法用__init__;因此我改了一下写法,(其他都没变,不用担忧。)直接贴代码了:

首先是下载模块(Download.py):


 

这个模块就多了  request = download()

第二个(def mzitu.py):

改动的地方我都有明确标注哦!仔细看看有什么不一样吧。

相关文章
相关标签/搜索