Scrapy 模擬登陸知乎--抓取熱點話題
折騰了將近兩天,中間數次想要放棄,還好硬著頭皮搞下去了,在此分享出來,希望有同等需求的各位能少走一些彎路。
原始碼放在了github上, 歡迎前往檢視。
若是幫你解決了問題,或者給了你啟發,不要吝嗇給加一星。
工具準備
在開始之前,請確保 scrpay 正確安裝,手頭有一款簡潔而強大的瀏覽器, 若是你有使用 postman 那就更好了。
Python1 | scrapy genspider zhihu |
使用以上命令生成知乎爬蟲,程式碼如下:
Python1234567891011 | # -*- coding: utf-8 -*-importscrapyclassZhihuSpider(scrapy.Spider):name='zhihu'allowed_domains=['www.zhihu.com']start_urls=['http://www.zhihu.com/']defparse(self,response):pass |
有一點切記,不要忘了啟用 Cookies, 切記切記 :
Python12 | # Disable cookies (enabled by default)COOKIES_ENABLED=True |
模擬登陸
過程如下:
- 進入登入頁,獲取 Header 和 Cookie 資訊
完善的 Header 資訊能儘量偽裝爬蟲, 有效 Cookie 資訊能迷惑知乎服務端,使其認為當前登入非首次登入,若無有效 Cookie 會遭遇驗證碼。 在抓取資料之前,請在瀏覽器中登入過知乎,這樣才使得 Cookie 是有效的。
Header 和 Cookie 整理如下:
Python1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | 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 引數, 這個引數與登陸驗證資訊無關,但很明顯是由登陸頁面攜帶的資訊。 Google了下 xsrf 的含義, 用於防範 跨站請求偽造 。
- 整理以上,程式碼如下:
Python1234567891011121314151617181920212223242526272829303132333435 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':'[email protected]','password':'xxxxxx',},callback=self.after_login)]
設定Bearer Token
經過上述步驟登陸成功了,有點小激動,有沒有! 但苦難到此還遠沒有結束,這個時候嘗試抓取最近熱門話題,直接返回 code:401 ,未授權的訪問。 授權資訊未設定,導致了此類錯誤,莫非遺漏了什麼,看來只能在瀏覽器中追蹤請求引數來偵測問題。 在瀏覽器的請求中,包含了Bearer Token, 而我在scrapy中模擬的請求中未包含此資訊, 所以我被伺服器認定為未授權的。 通過觀察發現 Bearer Token 的關鍵部分,就是 Cookies 中的 z_c0 包含的資訊。
z_c0 包含的資訊,是在登陸完成時種下的,所以從登陸完成返回的登陸資訊裡,獲取要設定的 Cookie 資訊, 然後拼接出 Bearer Token,最後設定到 Header 中。
程式碼整理如下:
Python12345678910111213141516171819202122 | defafter_login(self,response):jdict=json.loads(response.body)print('after_login',jdict)ifjdict['r']==0:z_c0=response.headers.getlist('Set-Cookie')[2].split(';')[0].split('=')[1]self.headers['authorization']='Bearer '+z_c0returnscrapy.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']) |
獲取資料
上述步驟後,資料獲取就水到渠成了,為了檢測成功與否, 把返回資訊寫到檔案中,而且只獲取前五十個,程式碼如下:
Python12345678910111213141516171819202122232425262728 | feedUrl='https://www.zhihu.com/api/v3/feed/topstory'nextFeedUrl=''curFeedId=0defparse(self,response):withopen('zhihu.json','a')asfd:fd.write(response.body)jdict=json.loads(response.body)jdatas=jdict['data']forentry injdatas:entry['pid']=entry['id']yieldentryjpaging=jdict['paging']self.curFeedId+=len(jdatas)ifjpaging['is_end']==Falseandself.curFeedId<50:self.nextFeedUrl=jpaging['next']yieldself.next_request(response)defnext_request(self,response):returnscrapy.http.FormRequest(url=self.nextFeedUrl,method='GET',meta={'cookiejar':response.meta['cookiejar']},headers=self.headers,callback=self.parse) |
最終獲取的資料如下圖所示:
寫在最後
知乎的資料,只有登入完成之後,才可有效的獲取,所以模擬登陸是無法忽略不管的。 所謂的模擬登陸,只是在scrapy中儘量的模擬在瀏覽器中的互動過程,使服務端無感抓包過程。 請求中附加有效的 Cookies 和 Headers 頭資訊,可有效的迷惑服務端, 同時在互動的過程中,獲取後續請求必要資訊和認證資訊,使得整個流程能不斷先前。
若是你遇到什麼問題,儘量提出來,歡迎一起來討論解決。
原始碼放在了github上, 歡迎前往檢視。
相關推薦
Scrapy 模擬登陸知乎--抓取熱點話題
折騰了將近兩天,中間數次想要放棄,還好硬著頭皮搞下去了,在此分享出來,希望有同等需求的各位能少走一些彎路。 原始碼放在了github上, 歡迎前往檢視。 若是幫你解決了問題,或者給了你啟發,不要吝嗇給加一星。 工具準備 在開始之前,請確保 scrpay 正確安裝,手頭有一款簡潔
【scrapy】模擬登陸知乎
這個網上有個通用的教程,然而為這個教程已經花費了太多時間進行除錯,和知乎上的朋友交流,很多人也是這個地方遇到了問題,最後的結果。。是放棄了crawlspider。。 先貼下 這個連結。。。http://ju.outofmemory.cn/entry/105646 謹慎。。
網站爬取-案例四:知乎抓取(COOKIE登錄抓取個人中心)(第二卷)
img 正則 人員 gin 爬取 com 個人 我們 一個 接著上卷來分析,作為開發人員我們都知道,登錄是一個想指定URL發送POST請求的過程,所以我們需要找到請求的URL,以及字段,先用一個錯誤賬號和密碼做一下嘗試,如果是正確的話會直接跳轉到別的頁面,這樣COOKIE就
python3 使用selenium模擬登陸天眼查抓取資料
由於之前用Scrapy 抓了一些公司的名稱,但是沒有準確的聯絡方式,所以就自己就學習了一下使用selenium自動化工具,速度比較慢,網上也有很多這方面的程式碼,但是大部分的網頁解析部分都出錯了,可能是這種網站定時會更改一下網頁的固定幾個標籤。 網上也有很多說如果遇到一些防爬蟲特別強的網站,比如企查
python爬蟲模擬登陸知乎網
自從暑假學了大概一個月左右的爬蟲,開學之後就沒怎麼搞爬蟲了,當時也就學到scrapy框架就放下了,大致瞭解了一下框架,不是太理解,但是在這之前本人的爬蟲水平也僅僅侷限於爬取簡單頁面,爬取動態頁面也稍微瞭解下,但是一直沒有學模擬登陸,因為當時怎麼也搞不懂模擬登陸是
Python 爬蟲-模擬登入知乎-爬取拉勾網職位資訊
用Python寫爬蟲是很方便的,最近看了xlzd.me的文章,他的文章寫的很到位,提供了很好的思路。因為他的文章部分程式碼省略了。下面是基於他的文章的三個程式碼片段: 基於Python3,Python2的話需要修改下input輸入函式和print的用法。 爬取豆瓣電影top250 爬取拉勾網職位資訊 模擬
最新,最新!selenium模擬登陸知乎
md知乎的程式猿是幹什麼的我不知道,反爬真不一般,深受其害!!! 試了一千萬種方法,哎,終於呀(千萬不要被知乎的程式猿看到了,要不然就又要涼涼了),其他方法特別是用request的好像都失效了(哪位大神要是還能用告訴兄弟一聲) 算是半手動吧,selenium裡面的js模組
使用OKHttp模擬登陸知乎,兼談OKHttp中Cookie的使用!
本文主要是想和大家探討技術,讓大家學會Cookie的使用,切勿做違法之事!很多Android初學者在剛開始學習的時候,或多或少都想自己搞個應用出來,把自己學的十八般武藝全都用在這個APP上,其實這個想法很好,專案驅動學習,效率更高,這是大學老師教給我的。可是一個APP,如果純
Python爬蟲之模擬登陸知乎
在chrome瀏覽器下抓取登陸過程的包(注意把Preserve log勾上): 表單的結構主要包括_xsrf, password, phone_num 我們要找到_xsrf的值,重新載入zhihu.
模擬登陸知乎,2016/10/23可用
登入這東西,目前理解的還是比較淺,就是說想辦法搞到cookie就好。最簡單就是自己用瀏覽器登入上,從開發者工具裡把cookie複製。。。 今天說的呢,既然是模擬登陸,就少不了賬號密碼這些環節。 首先開啟知乎https://www.zhihu.com/#signin,開發者工
利用python requests庫模擬登陸知乎
當初搜模擬登陸的時候在知乎上也找到一些內容。 以下是程式碼 import requests import time import json import os import re import sys import subprocess from bs4 import Be
用selenium模擬登陸知乎賬號,處理登陸介面隨機出現驗證碼視窗的問題
import requests from selenium import webdriver from bs4 import BeautifulSoup import time while True: #option = webdriver.Chr
scrapy框架項目:抓取全部知乎用戶信息,並且保存至mongodb
-- resp 用戶信息 ces filter name object api .com import scrapyimport json,time,refrom zhihuinfo.items import ZhihuinfoItemclass ZhihuSpider(s
scrapy 登陸知乎
參考 https://github.com/zkqiang/Zhihu-Login # -*- coding: utf-8 -*- import scrapy import time import re import base64 import hmac import hashlib import jso
selenium 模擬登入知乎和微博
sleep https epo element select selenium clas .com -c pip install selenium __author__ = ‘admin‘ __date__ = 2017 / 11 / 3 from selenium im
模擬登陸+數據爬取 (python+selenuim)
ref section ext 可能 https text entity 數據爬取 span 以下代碼是用來爬取LinkedIn網站一些學者的經歷的,僅供參考,註意:不要一次性大量爬取會被封號,不要問我為什麽知道 #-*- coding:utf-8 -*- from se
scrapy模擬登陸小例子
com rap wow64 for apple 模擬 spider log pri # -*- coding: utf-8 -*- import scrapy from scrapy.http import Request,FormRequest class Iqian
運維學python之爬蟲高級篇(六)scrapy模擬登陸
markdown inux ins com 是否 準備 配置 獲取圖片 con 上一篇介紹了如何爬取豆瓣TOP250的相關內容,今天我們來模擬登陸GitHub。 1 環境配置 語言:Python 3.6.1 IDE: Pycharm 瀏覽器:firefox 抓包工具:fi
爬蟲入門到精通-headers的詳細講解(模擬登入知乎)
直接開始案例吧。 本次我們實現如何模擬登陸知乎。 1.抓包 首先開啟知乎登入頁 知乎 - 與世界分享你的知識、經驗和見解 注意開啟開發者工具後點擊“preserve log”,密碼記得故意輸入錯誤,然後點選登入 我們很簡單的就找到了 我們需要的請
scrapy模擬瀏覽器翻頁爬取智聯
智聯爬取中,頁碼的數字和url是不匹配的,因此盲目的拼接url會造成錯誤,因此可以採用模擬瀏覽器爬取網頁 要模擬瀏覽器需要知道scrapy流程,簡圖如下: 這裡只是簡單的寫一些偽碼,設計的資料清洗部分請看scrapy資料清洗 middleswares.py from scrap