本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
我們的工具及庫為:python3.6、pycharm、requests庫
- 基本步驟:獲取網頁源代碼——匹配需要的內容——提取并保存,在這中間經常遇到這么幾類問題:
- 腳本中獲取的網頁源代碼和網頁右鍵查看的源代碼不同(編碼格式的問題除外),或者回傳400狀態碼
需要登錄才能獲取,不登錄不能查看源代碼,網頁中也是需要登錄才可以訪問), - 有驗證碼
- 開始可以獲取內容,運行一段時間后報錯(具體情況有:服務器拒絕連接,即ip被封等)一般為HTTPError
我們逐條看看
Headers的使用
某些網站反感爬蟲的到訪,于是直接拒絕所有爬蟲的請求,或者回傳其他的網頁原始碼比如:連接頻繁稍后在訪問,或者直接回傳403的狀態碼,比如抓取簡書主頁的時候出現下圖
這是因為我們在訪問網站服務器的時候,沒有做任何的偽裝,就相當于告訴服務器“我是個腳本”,那么服務器當然不客氣的拒絕你了!
處理方法其實很簡單,我們在代碼中偽裝自己是個瀏覽器就可以了,requests庫提供了相應的方法,headers引數,我們重新請求簡書主頁,加入我的headers引數,在看看結果
這樣就實作了網頁源代碼的獲取,這里用到了User-Agent這個引數,它的作用就是告訴HTTP服務器, 客戶端使用的作業系統和瀏覽器的名稱和版本值,獲取它也很簡單,比如我用的火狐瀏覽器,打開網頁后,用F12打開開發者工具,然后選擇網路,當訪問簡書主頁的時候,會出現很多的情請求,隨便找一個點擊一下,右邊就會出現請求頭了,如下圖:
而這個請求頭中的其他引數也很重要,具體我們在隨后的講解中慢慢解釋
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放到最后呢,因為用它可以解決大部分的反爬!是的,這個庫就是這么厲害!
這里就不詳細講了,隨后開個單篇,我們慢慢說!還是那句話,學習本身是一個漫長的程序,我們需要不斷的練習來增強我們的學習興趣,以及學到更扎實的知識!大家加油!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/237430.html
標籤:Python
