通常來講咱們會遇到網站反爬蟲策略下面幾點:python
咱們今天就來針對一、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)
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爬取下來吧!原本想讓你們本身寫,不過有用到正則表達式的,雖然簡單,不過有些怕是不會使。我也寫出來啦.
咱們來打印一下看看
下面[————–]中的內容就咱們添加進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):
改動的地方我都有明確標註哦!仔細看看有什麼不一樣吧。