python爬蟲零基礎入門——反爬的簡單說明

以前在《如何開始寫你的第一個python腳本——簡單爬蟲入門!》中給你們分享了一下寫一個爬蟲腳本的基本步驟,今天繼續分享給你們在初期遇到的一個很煩人的問題——反爬及處理辦法!python

咱們的工具及庫爲:python3.六、pycharm、requests庫瀏覽器

基本步驟:獲取網頁源代碼——匹配須要的內容——提取並保存。在這中間常常遇到這麼幾類問題:服務器

腳本中獲取的網頁源代碼和網頁右鍵查看的源代碼不一樣(編碼格式的問題除外),或者返回400狀態碼cookie

須要登陸才能獲取,不登陸不能查看源代碼,網頁中也是須要登陸才能夠訪問的網絡

有驗證碼session

開始能夠獲取內容,運行一段時間後報錯(具體狀況有:服務器拒絕鏈接,即ip被封等)通常爲HTTPError多線程

咱們逐條看看dom

Headers的使用

某些網站反感爬蟲的到訪,因而直接拒絕全部爬蟲的請求,或者返回其餘的網頁源碼好比:鏈接頻繁稍後在訪問,或者直接返回403的狀態碼,好比抓取簡書主頁的時候出現下圖函數

這是由於咱們在訪問網站服務器的時候,沒有作任何的假裝,就至關於告訴服務器「我是個腳本」,那麼服務器固然不客氣的拒絕你了!工具

處理方法其實很簡單,咱們在代碼中假裝本身是個瀏覽器就能夠了,requests庫提供了相應的方法,headers參數,咱們從新請求簡書主頁,加入個人headers參數,在看看結果

這樣就實現了網頁源代碼的獲取,這裏用到了User-Agent這個參數,它的做用就是告訴HTTP服務器, 客戶端使用的操做系統和瀏覽器的名稱和版本值,獲取它也很簡單,好比我用的火狐瀏覽器,打開網頁後,用F12打開開發者工具,而後選擇網絡,當訪問簡書主頁的時候,會出現不少的情請求,隨便找一個點擊一下,右邊就會出現請求頭了,以下圖:

python直播學習羣542110741

而這個請求頭中的其餘參數也很重要,具體咱們在隨後的講解中慢慢解釋

requests.session方法

在咱們想抓取某些須要登陸才能夠訪問的網頁時,就須要帶上cookie參數,這個參數在請求頭中,它記錄了咱們的帳號信息,具體實現的方法有2個,1就是加入header參數中或者獨立寫到requests中,代碼爲requests.get(url,cookie=cookie)。而requests庫還提供了另一個方法:

session,自動保存cookies,能夠設置請求參數,下次請求自動帶上請求參數

session能夠用來提供默認數據,函數參數級別的數據會和session級別的數據合併,若是key重複,函數參數級別的數據將覆蓋session級別的數據。若是想取消session的某個參數,能夠在傳遞一個相同key,value爲None的dict.

也就是說,咱們使用session提交cookie後,服務器若是對cookie有變更,那麼session也會自動記錄,很是方便,代碼實現:

s = requests.Session()

r = s.get(url,cookie=cookie)

print(r.text)

驗證碼的處理

對於一些簡單的驗證碼,能夠進行簡單的識別,可是有些反人類的好比12306的驗證碼,要麼直接程序中顯示並手工驗證,要麼經過第三方的打碼平臺進行驗證,固然這個是要收費的。

requests.proxies方法、time模塊

咱們常常會遇到,腳本能夠正常運行,可是很快就出現了報錯,遠程服務器斷開鏈接或者拒絕訪問等等狀況,這是由於好多網站都有設定訪問速度、次數、流量之類的。

同時這裏也但願你們控制住本身,不要多線程不限制的下載,那樣對網站很很差的!

這種狀況下,requests庫提供了一個proxies的方法,就是指定ip代理的功能,它的格式是{"http": "http://10.10.10.10:3128"}這樣的,注意key值部分,必定要正確,不然會報錯。

而不用代理的話,也能夠在程序中人工加入休眠時間的方式來強制腳本不那麼快的運行,這就須要用到time庫了,好比每次請求間隔0.5秒:time.sleep(0.5),或者加上random庫,這樣:time.sleep(random.random()*2)

自動化測試工具 selenium

爲何要把selenium放到最後呢,由於用它能夠解決大部分的反爬!是的,這個庫就是這麼厲害!

這裏就不詳細講了,隨後開個單篇,咱們慢慢說!仍是那句話,學習自己是一個漫長的過程,咱們須要不斷的練習來加強咱們的學習興趣,以及學到更紮實的知識!你們加油!

相關文章
相關標籤/搜索