scrapy模擬登陸知乎--抓取熱點話題

工具準備

在開始之前挪鹏,請確保scrpay正確安裝癌佩,手頭有一款簡潔而強大的瀏覽器冲簿, 若是你有使用postman那就更好了沾乘。

scrapy genspider zhihu

使用以上命令生成知乎爬蟲,代碼如下:

# -*- coding: utf-8 -*-import scrapyclassZhihuSpider(scrapy.Spider):? ? name ='zhihu'? ? allowed_domains = ['www.zhihu.com']? ? start_urls = ['http://www.zhihu.com/']defparse(self, response):pass

有一點切記拦焚,不要忘了啟用Cookies,切記切記

# Disable cookies (enabled by default)COOKIES_ENABLED =True

模擬登陸

過程如下:

進入登錄頁,獲取HeaderCookie信息惕医,

完善的Header信息能盡量偽裝爬蟲耕漱, 有效Cookie信息能迷惑知乎服務(wù)端,使其認為當(dāng)前登錄非首次登錄抬伺,若無有效Cookie會遭遇驗證碼螟够。 在抓取數(shù)據(jù)之前,請在瀏覽器中登錄過知乎峡钓,這樣才使得Cookie是有效的妓笙。

歡迎加入我的QQ群`923414804`與我一起學(xué)習(xí),群里有我學(xué)習(xí)過程中整理的大量學(xué)習(xí)資料能岩。加群即可免費獲取

HeaderCookie整理如下:

headers = {'Host':'www.zhihu.com','Connection':'keep-alive','Origin':'https://www.zhihu.com','User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36','Content-Type':'application/x-www-form-urlencoded; charset=UTF-8','Accept':'*/*','X-Requested-With':'XMLHttpRequest','DNT':1,'Referer':'https://www.zhihu.com/','Accept-Encoding':'gzip, deflate, br','Accept-Language':'zh-CN,zh;q=0.8,en;q=0.6',}cookies = {'d_c0':'"AHCAtu1iqAmPTped76X1ZdN0X_qAwhjdLUU=|1458699045"','__utma':'51854390.1407411155.1458699046.1458699046.1458699046.1','__utmv':'51854390.000--|3=entry_date=20160322=1','_zap':'850897bb-cba4-4d0b-8653-fd65e7578ac2','q_c1':'b7918ff9a5514d2981c30050c8c732e1|1502937247000|1491446589000','aliyungf_tc':'AQAAAHVgviiNyQsAOhSntJ5J/coWYtad','_xsrf':'b12fdca8-cb35-407a-bc4c-6b05feff37cb','l_cap_id':'"MDk0MzRjYjM4NjAwNDU0MzhlYWNlODQ3MGQzZWM0YWU=|1503382513|9af99534aa22d5db92c7f58b45f3f3c772675fed"','r_cap_id':'"M2RlNDZjN2RkNTBmNGFmNDk2ZjY4NjIzY2FmNTE4NDg=|1503382513|13370a99ee367273b71d877de17f05b2986ce0ef"','cap_id':'"NmZjODUxZjQ0NzgxNGEzNmJiOTJhOTlkMTVjNWIxMDQ=|1503382513|dba2e9c6af7f950547474f827ef440d7a2950163"',

}

在瀏覽器中寞宫,模擬登陸,抓取登陸請求信息拉鹃。

從圖中可以看到_xsrf參數(shù), 這個參數(shù)與登陸驗證信息無關(guān)辈赋,但很明顯是由登陸頁面攜帶的信息。Google了下xsrf的含義膏燕, 用于防范跨站請求偽造钥屈。


整理以上,代碼如下:

loginUrl ='https://www.zhihu.com/#signin'siginUrl ='https://www.zhihu.com/login/email'defstart_requests(self):return [? ? ? ? scrapy.http.FormRequest(? ? ? ? ? ? self.loginUrl,? ? ? ? ? ? headers=self.headers,? ? ? ? ? ? cookies=self.cookies,? ? ? ? ? ? meta={'cookiejar':1},? ? ? ? ? ? callback=self.post_login)? ? ]defpost_login(self, response):? ? xsrf = response.css('div.view-signin > form > input[name=_xsrf]::attr(value)'? ? ).extract_first()? ? self.headers['X-Xsrftoken'] = xsrfreturn [? ? ? ? scrapy.http.FormRequest(? ? ? ? ? ? self.siginUrl,? ? ? ? ? ? method='POST',? ? ? ? ? ? headers=self.headers,? ? ? ? ? ? meta={'cookiejar': response.meta['cookiejar']},? ? ? ? ? ? formdata={'_xsrf': xsrf,'captcha_type':'cn','email':'xxxxxx@163.com','password':'xxxxxx',

? ? ? ? ? ? },

? ? ? ? ? ? callback=self.after_login)

? ? ]

設(shè)置Bearer Token

經(jīng)過上述步驟登陸成功了坝辫,有點小激動篷就,有沒有! 但苦難到此還遠沒有結(jié)束近忙,這個時候嘗試抓取最近熱門話題竭业,直接返回code:401,未授權(quán)的訪問。 授權(quán)信息未設(shè)置及舍,導(dǎo)致了此類錯誤未辆,莫非遺漏了什么,看來只能在瀏覽器中追蹤請求參數(shù)來偵測問題锯玛。 在瀏覽器的請求中鼎姐,包含了Bearer Token, 而我在scrapy中模擬的請求中未包含此信息, 所以我被服務(wù)器認定為未授權(quán)的更振。 通過觀察發(fā)現(xiàn)Bearer Token的關(guān)鍵部分,就是Cookies中的z_c0包含的信息饭尝。


z_c0包含的信息肯腕,是在登陸完成時種下的,所以從登陸完成返回的登陸信息里钥平,獲取要設(shè)置的Cookie信息实撒, 然后拼接出Bearer Token,最后設(shè)置到Header中姊途。

代碼整理如下:

defafter_login(self, response):? ? jdict = json.loads(response.body)? ? print('after_login', jdict)if jdict['r'] ==0:? ? ? ? z_c0 = response.headers.getlist('Set-Cookie')[2].split(';')[0].split('=')[1]? ? ? ? self.headers['authorization'] ='Bearer ' + z_c0return scrapy.http.FormRequest(? ? ? ? ? ? url=self.feedUrl,? ? ? ? ? ? method='GET',? ? ? ? ? ? meta={'cookiejar': response.meta['cookiejar']},? ? ? ? ? ? headers=self.headers,? ? ? ? ? ? formdata={'action_feed':'True','limit':'10','action':'down','after_id': str(self.curFeedId),'desktop':'true'? ? ? ? ? ? },? ? ? ? ? ? callback=self.parse)else:? ? ? ? print(jdict['error'])

獲取數(shù)據(jù)

上述步驟后,數(shù)據(jù)獲取就水到渠成了知态,為了檢測成功與否捷兰, 把返回信息寫到文件中,而且只獲取前五十個,代碼如下:

feedUrl ='https://www.zhihu.com/api/v3/feed/topstory'nextFeedUrl =''curFeedId =0defparse(self, response):with open('zhihu.json','a')as fd:? ? ? ? fd.write(response.body)? ? jdict = json.loads(response.body)? ? jdatas = jdict['data']for entryin jdatas:? ? ? ? entry['pid'] = entry['id']yield entry? ? jpaging = jdict['paging']? ? self.curFeedId += len(jdatas)if jpaging['is_end'] ==Falseand self.curFeedId <50:? ? ? ? self.nextFeedUrl = jpaging['next']yield self.next_request(response)defnext_request(self, response):return scrapy.http.FormRequest(? ? ? ? url=self.nextFeedUrl,? ? ? ? method='GET',? ? ? ? meta={'cookiejar': response.meta['cookiejar']},

? ? ? ? headers=self.headers,

? ? ? ? callback=self.parse)

最終獲取的數(shù)據(jù)如下圖所示:

寫在最后

知乎的數(shù)據(jù),只有登錄完成之后负敏,才可有效的獲取贡茅,所以模擬登陸是無法忽略不管的。 所謂的模擬登陸其做,只是在scrapy中盡量的模擬在瀏覽器中的交互過程顶考,使服務(wù)端無感抓包過程。 請求中附加有效的CookiesHeaders頭信息妖泄,可有效的迷惑服務(wù)端驹沿, 同時在交互的過程中,獲取后續(xù)請求必要信息和認證信息蹈胡,使得整個流程能不斷先前渊季。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市罚渐,隨后出現(xiàn)的幾起案子却汉,更是在濱河造成了極大的恐慌,老刑警劉巖搅轿,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件病涨,死亡現(xiàn)場離奇詭異,居然都是意外死亡璧坟,警方通過查閱死者的電腦和手機既穆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雀鹃,“玉大人幻工,你說我怎么就攤上這事±杈ィ” “怎么了囊颅?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長傅瞻。 經(jīng)常有香客問我踢代,道長,這世上最難降的妖魔是什么嗅骄? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任胳挎,我火速辦了婚禮,結(jié)果婚禮上溺森,老公的妹妹穿的比我還像新娘慕爬。我一直安慰自己窑眯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布医窿。 她就那樣靜靜地躺著磅甩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姥卢。 梳的紋絲不亂的頭發(fā)上卷要,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音隔显,去河邊找鬼却妨。 笑死,一個胖子當(dāng)著我的面吹牛括眠,可吹牛的內(nèi)容都是我干的彪标。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掷豺,長吁一口氣:“原來是場噩夢啊……” “哼捞烟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起当船,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤题画,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后德频,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苍息,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年壹置,在試婚紗的時候發(fā)現(xiàn)自己被綠了竞思。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡钞护,死狀恐怖盖喷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情难咕,我是刑警寧澤课梳,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站余佃,受9級特大地震影響暮刃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爆土,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一椭懊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雾消,春花似錦灾搏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至桑腮,卻和暖如春泉哈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背破讨。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工丛晦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人提陶。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓烫沙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親隙笆。 傳聞我的和親對象是個殘疾皇子锌蓄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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