Python 筆記七:Requests爬蟲技巧

Python 筆記七:Requests爬蟲技巧

源碼github地址在此,記得點(diǎn)星:
https://github.com/brandonxiang/example-requests

這篇筆記的靈感來自Python爬蟲:一些常用的爬蟲技巧總結(jié),我這篇筆記也算是一篇山寨筆記,文中會(huì)大量引用他人文章。原因很簡(jiǎn)單,因?yàn)樵撐臈l理清晰,言簡(jiǎn)意賅。唯一一點(diǎn)我不太滿意就是現(xiàn)在python的爬蟲技巧應(yīng)該專注于RequestsBeautifulSoup這樣的第三方庫(kù)。這兩個(gè)庫(kù)確實(shí)成為了python爬蟲的標(biāo)配,更符合python語法簡(jiǎn)潔的特點(diǎn),替代了urllibre等復(fù)雜的老式爬蟲手段,可以說是,前所未有地實(shí)現(xiàn)了爬蟲的快速開發(fā)模型。關(guān)于Requests的具體用法可以參考官網(wǎng),自從有了Requests之后,就再也不需要Postman這樣的接口調(diào)試器,也不需要curl了。當(dāng)然,這是開玩笑的。

希望這篇文章也能給大家一個(gè)簡(jiǎn)單的認(rèn)識(shí),python就像一個(gè)瑞士軍刀,而讓爬蟲這種本來繁瑣的動(dòng)作變得簡(jiǎn)單。

基本抓取網(wǎng)頁

get方法

import requests

url = 'http://www.baidu.com'
response = requests.get(url)
print response.content  # 網(wǎng)站內(nèi)容
print response.status_code  # 狀態(tài)碼
print response.headers['content-type']  # header
print response.encoding  # 網(wǎng)頁編碼

post方法

import requests

url = "http://abcde.com"
form = {'name': 'abc', 'password': '1234'}
response = requests.post(url, data=form)
print response.text

使用代理IP

在開發(fā)爬蟲過程中經(jīng)常會(huì)遇到IP被封掉的情況,這時(shí)就需要用到代理IP

這個(gè)可以參考python的擴(kuò)展包requests的高級(jí)用法

import requests

url = "http://www.baidu.com"
proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}
response = requests.get(url, proxies=proxies)
print response.content

Cookies處理

cookies是某些網(wǎng)站為了辨別用戶身份、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)

你可以提前用Chrome Dev Tool去獲取對(duì)應(yīng)的cookie,將其輸入到該參數(shù)當(dāng)中。requests自帶session。

import requests

session = requests.Session()
response = session.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(response.text)

偽裝成瀏覽器

某些網(wǎng)站反感爬蟲的到訪,于是對(duì)爬蟲一律拒絕請(qǐng)求。所以用urllib2直接訪問網(wǎng)站經(jīng)常會(huì)出現(xiàn)HTTP Error 403: Forbidden的情況
對(duì)有些 header 要特別留意,Server 端會(huì)針對(duì)這些 header 做檢查
1.User-Agent 有些 Server 或 Proxy 會(huì)檢查該值,用來判斷是否是瀏覽器發(fā)起的 Request
2.Content-Type 在使用 REST 接口時(shí),Server 會(huì)檢查該值,用來確定 HTTP Body 中的內(nèi)容該怎樣解析。

通過header讓requests的程序去偽裝瀏覽器,或者該網(wǎng)頁的環(huán)境,可以有效避免服務(wù)器拒絕和跨域限制。

import requests

url = "http://www.baidu.com"
headers = {
    'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
}
response = requests.get(url,headers = headers)
print response.content

頁面解析

頁面解析的最傳統(tǒng)方法--正則表達(dá)式,參考正則表達(dá)式入門正則表達(dá)式在線測(cè)試 。關(guān)于解析庫(kù),有lxmlBeautifulSoup,他們的教程有很多,前者還是涉及到正則表達(dá)式 。
對(duì)于我再說,我不是大牛,想個(gè)正則表達(dá)式都要半天。還是用Beautifulsoup純python實(shí)現(xiàn),效率低,但是開發(fā)效率高,讓電腦慢慢來吧。

驗(yàn)證碼的處理

對(duì)于復(fù)雜的驗(yàn)證碼識(shí)別可能有點(diǎn)難度,但是,簡(jiǎn)單的圖形識(shí)別還是十分容易的,有興趣的童鞋,請(qǐng)參考Python驗(yàn)證碼識(shí)別:利用pytesser識(shí)別簡(jiǎn)單圖形驗(yàn)證碼

gzip壓縮

有沒有遇到過某些網(wǎng)頁,不論怎么轉(zhuǎn)碼都是一團(tuán)亂碼。哈哈,那說明你還不知道許多web服務(wù)具有發(fā)送壓縮數(shù)據(jù)的能力,這可以將網(wǎng)絡(luò)線路上傳輸?shù)拇罅繑?shù)據(jù)消減 60% 以上。這尤其適用于 XML web 服務(wù),因?yàn)?XML 數(shù)據(jù) 的壓縮率可以很高。

其實(shí)網(wǎng)頁壓縮有兩種,一種是deflate,另一種是gzip。deflate已經(jīng)在淘汰的邊緣,但是國(guó)內(nèi)一些老網(wǎng)站還在使用。具體請(qǐng)參考我的另一篇文章--6入門爬蟲坑--網(wǎng)頁數(shù)據(jù)壓縮(python deflate gzip)。

總結(jié)

該筆記描述那么多方面,好像只是講了requests模塊的參數(shù)而已。這也說明了它的強(qiáng)大,但是前提是你必須懂對(duì)應(yīng)的原理。參數(shù)如下:

  • json: json數(shù)據(jù)傳到requests的body
  • headers: HTTP Headers的字典傳到requests的header
  • cookies: 可以使用字典或者CookieJar object
  • files: 字典{'name': file-tuple} 來實(shí)現(xiàn)multipart encoding upload, 2參數(shù)元組 ('filename', fileobj), 3參數(shù)元組 ('filename', fileobj, 'content_type')或者 4參數(shù)元組 ('filename', fileobj, 'content_type', custom_headers), 其中'content-type' 用于定于文件類型和custom_headers文件的headers
  • auth: Auth元組定義用于Basic/Digest/Custom HTTP Auth
  • timeout: 連接等待時(shí)長(zhǎng)
  • allow_redirects: 布爾型, True代表POST/PUT/DELETE只有的重定向是允許的
  • proxies: 代理的地址
  • verify: 用于認(rèn)證SSL證書
  • stream: False代表返回內(nèi)容立刻下載
  • cert: String代表ssl client證書地址(.pem) Tuple代表('cert', 'key')鍵值對(duì)

參考:
Python爬蟲學(xué)習(xí)系列教程
設(shè)計(jì)Pythonic API

轉(zhuǎn)載,請(qǐng)表明出處。總目錄Awesome GIS

轉(zhuǎn)載,請(qǐng)表明出處。總目錄后端記事本

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容