溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Scrapy爬取知乎中怎么模擬登錄

發(fā)布時間:2021-12-04 19:19:13 來源:億速云 閱讀:101 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹Scrapy爬取知乎中怎么模擬登錄,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

從今天開始更新關(guān)于爬取知乎的一系列文章,最近一直在優(yōu)化代碼,奈何代理IP有用的都是要錢的,所以已經(jīng)不知道怎么優(yōu)化了,發(fā)出來大家也參考參考,順便提點意見。

知乎對于爬蟲還是很友好的。所以其實也挺好弄得。

Scrapy爬取知乎中怎么模擬登錄

這是知乎剛進來的頁面必須要登錄。但是有時候是需要驗證碼而有時候不需要。所以這也需要做一個判斷。

我們的最終目標(biāo)是構(gòu)建 POST 請求所需的 Headers 和 Form-Data 這兩個對象即可。

繼續(xù)看Requests Headers信息,和登錄頁面的 GET 請求對比發(fā)現(xiàn),這個 POST 的頭部多了三個身份驗證字段,經(jīng)測試x-xsrftoken是必需的。

x-xsrftoken則是防 Xsrf 跨站的 Token 認證,訪問首頁時從Response HeadersSet-Cookie字段中可以找到。

具體的form-data: 可以參考知乎專欄:https://zhuanlan.zhihu.com/p/34073256

我的代碼里沒有實現(xiàn)點擊倒立漢字的功能,有興趣的可以去嘗試。

Scrapy爬取知乎中怎么模擬登錄

def start_requests(self):
   # 進入登錄頁面,回調(diào)函數(shù)start_login()
   yield scrapy.Request('https://www.zhihu.com/api/v3/oauth/captcha?lang=en',headers=self.headers,callback=self.start_login, meta={'cookiejar': 1},)  # meta={'cookiejar':1}

這是直接去get它的驗證碼,URL后面加參數(shù)lang=en,他請求到的就會只有英文驗證碼,不會出現(xiàn)倒立的漢字。

def start_login(self,response):
   # 判斷是否需要驗證碼
  need_cap=json.loads(response.body)['show_captcha']
   # re.search(r'true', resp.text)
   print(need_cap)
   if need_cap:
       print('需要驗證碼')
       yield scrapy.Request('https://www.zhihu.com/api/v3/oauth/captcha?lang=en',headers=self.headers,callback=self.capture,method='PUT', meta={'cookiejar': response.meta['cookiejar']})

   else:
       print('不需要驗證碼')
       post_url = 'https://www.zhihu.com/api/v3/oauth/sign_in'
       post_data ={
           'client_id': self.client_id,
           'grant_type': self.grant_type,
           'timestamp': self.timestamp,
           'source': self.source,
           'signature': self.get_signnature(self.grant_type, self.client_id, self.source, self.timestamp),
           'username': '+861777777',
           'password': '123456',
           'captcha': '',
           # 改為'cn'是倒立漢字驗證碼
           'lang': 'en',
           'ref_source': 'other_',
           'utm_source': ''}
       yield scrapy.FormRequest(url=post_url, formdata=post_data, headers=self.headers, meta={'cookiejar': response.meta['cookiejar']},)

這個函數(shù)有點小問題就是每次其實都會請求到驗證碼,所以有時候不需要驗證碼也還是要輸入,要改進的話需要用正則去匹配響應(yīng)的TRUE。但是感覺也沒啥的,因為基本只需要登錄一次,保存cookies就可以了。

def capture(self,response):
   try:
       img = json.loads(response.body)['img_base64']
   except ValueError:
       print('獲取img_base64的值失??!')
   else:
       img = img.encode('utf8')
       img_data = base64.b64decode(img)

       with open('zhihu.gif', 'wb') as f:
           f.write(img_data)
           f.close()
   captcha = input('請輸入驗證碼:')
   post_data = {
       'client_id': self.client_id,
       'grant_type': self.grant_type,
       'timestamp': self.timestamp,
       'source': self.source,
       'signature': self.get_signnature(self.grant_type, self.client_id, self.source, self.timestamp),
       'username': '+861777777777',
       'password': '123456',
       'captcha': captcha,
     'lang': 'en',
       'ref_source': 'other_',
       'utm_source': '',
       '_xsrf': '0sQhRIVITLlEX8kQWA09VOqsPlSqRJQT'
   }
   yield scrapy.FormRequest(
       url='https://www.zhihu.com/signin',
       formdata=post_data,
       callback=self.after_login,
       headers=self.headers,
       meta={'cookiejar': response.meta['cookiejar']},
   )
COOKIES_ENABLED = True

在setting.py中修改這個。意思就是使用自己定義的cookie。

def after_login(self, response):
   if response.status == 200:
       print("登錄成功")
       """
               登陸完成后從第一個用戶開始爬數(shù)據(jù)                """
       return [scrapy.Request(
           self.start_url,
           meta={'cookiejar': response.meta['cookiejar']},
           callback=self.parse_people,
           errback=self.parse_err,
       )]
   else:
       print("登錄失敗")

登錄成功去請求下一個方法,登錄失敗可以打印響應(yīng)的內(nèi)容或者重新輸入,這一部分我沒具體寫。

關(guān)于Scrapy爬取知乎中怎么模擬登錄就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI