以知乎爲例試探討一種萬能模擬登陸方式

以我們的日常上網的經驗,有時我們好像不必登陸也能進入個人頁面,原因大家都知道–cookies,根據這個思路,我們只要獲取登陸之後的cookies我們就可以隨意訪問網站,但是要獲取登陸後的cookies必須要先登陸,而現在的網站登陸時都有各種各樣的驗證碼,一個網站一個驗證原理(比如知乎的點擊倒立文字就很特別),這就給我們登陸時帶來了不少麻煩,解決了這個還有那個,遇到一個新的驗證方式還需要重新研究,我今天要分享的就是一個笨拙但是卻像“萬金油 式的方法”–手工+selenium+requests。

1.總體思路

大家都知道selenium非常容易模擬登陸,但是卻不擅長爬取信息,太慢了,所以我們就發揮它的長處,只用在登陸上,然後把登陸後的cookies傳遞給requests,然後利用requests去進行下面的爬取工作,各施所長。

2 .具體代碼

python
#_*_coding:utf8_*_
from selenium import webdriver
import requests
import time


#利用selenium登錄,獲取cookies
br=webdriver.Chrome()
br.get("https://www.zhihu.com/#signin")
br.find_element_by_xpath("//span[contains(text(),'使用密碼登錄')]").click()
br.find_element_by_xpath("//input[@name='account']").send_keys("*********")
br.find_element_by_xpath("//input[@name='password']").send_keys("**********")
time.sleep(5)#手工點擊驗證碼倒立文字預留時間
br.find_element_by_xpath("//button[contains(text(),'登錄')]").click()
time.sleep(3)#網頁加載時間
selenium_cookies=br.get_cookies()#把selenium獲取的cookies保存到變量,備用。
# print(selenium_cookies)
br.quit()

#接下來由requests接收selenium的cookies,並訪問網站
s=requests.Session()
for i in selenium_cookies:
    requests.utils.add_dict_to_cookiejar(s.cookies, {i['name']:i['value']})
headers={
    'Host':'www.zhihu.com',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/55.0',
    'Accept':'text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8',
    'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding':'gzip, deflate, br',
    'Connection':'keep-alive',
    'Upgrade-Insecure-Requests':'1',
    'Pragma':'',
    'Cache-Control':'',
}
r=s.get("https://www.zhihu.com",headers=headers).content.decode('utf-8')
print(r)#訪問個人中心驗證

在此次試驗中我遇到最大的坑就是selenium的cookies轉換成requests的cookiejar對象了,查了好多資料,最終在官方文檔裏找到了答案,關於requests的cookie處理及cookiejar對象我會再總結一篇,以上。2017-10-2。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章