爬蟲必備——requests(轉(zhuǎn))

轉(zhuǎn)自:https://zhuanlan.zhihu.com/p/20410446?refer=xlz-d

作者:xlzd

鏈接:https://zhuanlan.zhihu.com/p/20410446

來源:知乎

著作權(quán)歸作者所有砸讳。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處界牡。

最近有幾個知乎上的朋友私信問到關(guān)于爬蟲爬取數(shù)據(jù)的時候總是出現(xiàn)這樣或者那樣的問題簿寂,這里介紹一個Python HTTP庫: requests。Requests是一個基于Apache2協(xié)議開源的Python HTTP庫宿亡,號稱是“為人類準備的HTTP庫”常遂。

Python中,系統(tǒng)自帶的urllib和urllib2都提供了功能強大的HTTP支持挽荠,但是API接口確實太難用了克胳。requests作為更高一層的封裝,確實在大部分情況下對得起它的slogan——HTTP for Humans圈匆。

發(fā)送請求

廢話少說漠另,先看看requests的簡單使用吧:

In[1]:importrequestsIn[2]:resp=requests.get('http://xlzd.me')In[3]:resp.status_codeOut[3]:200

發(fā)送一個完整的HTTP請求,只需要一句代碼即可跃赚。發(fā)送其它方式的請求同樣如此簡潔:

In[1]:r=requests.post("http://xlzd.me/login",data={"user":"xlzd","pass":"mypassword"})In[2]:r=requests.put("http://xlzd.me/post",data={"title":"article"})In[3]:r=requests.delete("http://xlzd.me/foo")In[4]:r=requests.head("http://xlzd.me/bar")In[5]:r=requests.options("http://xlzd.me/abc")

解析URL中的參數(shù)

在GET請求的時候笆搓,經(jīng)常會有很多查詢參數(shù)接在URL后面,形如http://xlzd.me/query?name=xlzd&&lang=python,在拼接URL的時候常常容易出現(xiàn)拼接錯誤的情況砚作,對此你可以使用如下代碼讓這個過程變得簡潔明了:

In[1]:r=requests.get("http://xlzd.me/query",params={"name":"xlzd","lang":"python"})In[2]:printr.urlOut[2]:http://xlzd.me/query?name=xlzd&&lang=python

如上窘奏,字典中的參數(shù)會被requests自動解析并且正確連接到URL中嘹锁。

響應內(nèi)容

如上的代碼拿到的是一個HTTP response葫录,那么怎樣取出里面的內(nèi)容呢?

In[7]:r=requests.get('http://xlzd.me')In[8]:r.encodingOut[8]:'UTF-8'In[9]:r.headersOut[9]:{'Content-Encoding':'gzip','Transfer-Encoding':'chunked','Vary':'Accept-Encoding','Server':'nginx','Connection':'keep-alive','Date':'Fri, 11 Dec 2015 06:42:31 GMT','Content-Type':'text/html; charset=UTF-8','X-Pingback':'http://xlzd.me/action/xmlrpc'}In[10]:r.cookiesOut[10]:In[11]:r.textOut[11]:u'\n\n\t

requests會自動對響應內(nèi)容編碼领猾,所以就可以通過r.text取出響應文本了米同。對于別等響應內(nèi)容(文件、圖片摔竿、...)面粮,則可以通過r.content取出來。對于json內(nèi)容继低,也可以通過r.json()來取熬苍。

自定義Headers

對于寫爬蟲來講,模擬瀏覽器是發(fā)請求的時候做的最多的事情了袁翁,最常見的模擬瀏覽器無非就是偽裝headers:

In[23]:url='http://xlzd.me'In[24]:headers={'User-Agent':'my custom user agent','Cookie':'haha'}In[25]:requests.get(url,headers=headers)

重定向和超時

requests之所以稱為“HTTP for human”柴底,因為其封裝層次很高,其中一處體現(xiàn)就在:requests會自動處理服務器響應的重定向粱胜。我在做搜狗微信公眾號抓取的時候柄驻,搜狗搜索列表頁面的公眾號文章地址,其實不是微信的地址而需要請求到搜狗到服務器做重定向焙压,而requests的默認處理則是將整個過程全部搞定鸿脓,對此可以這樣:

In[1]:r=requests.get('http://xlzd.me',allow_redirects=False)

allow_redirects參數(shù)為False則表示不會主動重定向。

另外涯曲,有時候?qū)Ψ骄W(wǎng)站的響應時間太長了野哭,我們希望在指定時間內(nèi)完事,或者直接停止這個請求幻件,這時候的做法是:

In[1]:r=requests.get('http://xlzd.me',timeout=3)

timeout表示這次請求最長我最長只等待多少秒拨黔,

代理

為requests套上一層代理的做法也非常簡單:

import requestsproxies = {? "http": "http://192.168.31.1:3128",? "https": "http://10.10.1.10:1080",}requests.get("http://xlzd.me", proxies=proxies)

會話對象

服務器端通過session來區(qū)分不同的用戶請求(瀏覽器會話),requests的會話對象是用來模擬這樣的操作的傲武,比如可以跨請求保持某些參數(shù):就像你在訪問微博的時候蓉驹,不需要每次翻頁都重新登錄一次。

session=requests.Session()session.post('http://xlzd.me/login',data={'user':'xlzd','pass':'mypassword'})# 登錄成功則可以發(fā)布文章了session.put('http://xlzd.me/new',data={'title':'title of article','data':'content'})

另外揪利,requests.Session對象也可以直接使用上面的所有方法喲态兴。

小結(jié)

requests彌補了Python自帶的urllib和urllib2的不好使用,通過使用requests疟位,可以更方便瞻润、更直觀的處理網(wǎng)絡請求相關(guān)的代碼,在網(wǎng)絡爬蟲的編寫過程中更加得心應手。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绍撞,一起剝皮案震驚了整個濱河市正勒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌傻铣,老刑警劉巖章贞,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異非洲,居然都是意外死亡鸭限,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門两踏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來败京,“玉大人,你說我怎么就攤上這事梦染∩穆螅” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵帕识,是天一觀的道長泛粹。 經(jīng)常有香客問我,道長渡冻,這世上最難降的妖魔是什么戚扳? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮族吻,結(jié)果婚禮上帽借,老公的妹妹穿的比我還像新娘。我一直安慰自己超歌,他們只是感情好砍艾,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巍举,像睡著了一般脆荷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懊悯,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天蜓谋,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛咏窿,可吹牛的內(nèi)容都是我干的徙融。 我是一名探鬼主播咪惠,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼惩猫,長吁一口氣:“原來是場噩夢啊……” “哼嘁灯!你這毒婦竟也來了辞友?” 一聲冷哼從身側(cè)響起师痕,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤溃睹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后胰坟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體因篇,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年腕铸,在試婚紗的時候發(fā)現(xiàn)自己被綠了惜犀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡狠裹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汽烦,到底是詐尸還是另有隱情涛菠,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布撇吞,位于F島的核電站俗冻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏牍颈。R本人自食惡果不足惜迄薄,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煮岁。 院中可真熱鬧讥蔽,春花似錦、人聲如沸画机。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽步氏。三九已至响禽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荚醒,已是汗流浹背芋类。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留界阁,地道東北人侯繁。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像铺董,于是被迫代替她去往敵國和親巫击。 傳聞我的和親對象是個殘疾皇子禀晓,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容