你要偷偷的學Python,而後驚呆全部人(第十一天)

 

標題無心冒犯,就是以爲這個廣告挺好玩的python

文章目錄

  • 前言
  • 歡迎來到咱們的圈子
  • 繞過登陸驗證的小餅乾:cookies and session
  • 聲明
  • 什麼是cookies?什麼是session?
  • 是如何實現「記住個人登陸狀態」的功能
  • post請求
  • 實操第一步
  • 鋒迴路轉
  • 把小餅乾裝進餅乾盒
  • 自動化實現:selenium
  • 先展現一下
  • 代碼展現
  • 環境配置
  • selenium簡單講解
  • 設置瀏覽器引擎
  • selenium能幹嗎?
  • 爲何selenium這麼能幹?

 

前言

前期回顧:你要偷偷學Python(第十天)web

上一篇呢,上一篇不是很好,我本身有數。因此,這一篇我準備了很多有意思的東西(壞笑),嘿嘿,快來跟我動手操做。chrome

我行,你也行!!!數據庫

 

插播一條推送:(若是是小白的話,能夠看一下下面這一段)npm

歡迎來到咱們的圈子

我建了一個Python學習答疑羣,有興趣的朋友能夠了解一下:若是你們在學習中遇到困難,想找一個python學習交流環境,能夠加入咱們的python圈,裙號947618024,可領取python學習資料,會節約不少時間,減小不少遇到的難題。json


本系列文默認各位有必定的C或C++基礎,由於我是學了點C++的皮毛以後入手的Python。 本系列文默認各位會百度,學習‘模塊’這個模塊的話,仍是建議你們有本身的編輯器和編譯器的,上一篇已經給你們作了推薦啦? 而後呢,本系列的目錄嘛,說實話我我的比較傾向於那兩本 Primer Plus,因此就跟着它們的目錄結構吧。 本系列也會着重培養各位的自主動手能力,畢竟我不可能把全部知識點都給你講到,因此本身解決需求的能力就尤其重要,因此我在文中埋得坑請不要把它們當作坑,那是我留給大家的鍛鍊機會,請各顯神通,自行解決。 1234567

繞過登陸驗證的小餅乾:cookies and session

聲明

看到這個標題,激動不?難道,今天咱也能去盜號了嗎?嘿嘿,準備好黑頭套。
喂喂喂,醒醒,醒醒,哈喇子都流出來了。咱但是遵紀守法好公民,怎麼去幹這種事情?swift

我只會教你,怎麼在人家點擊了「記住帳號密碼」的狀況下,你給它繞過登陸驗證。至於你要怎麼拿到這個條件,那跟我不要緊啊,特此聲明哈哈哈。瀏覽器

看了我前兩天發的那篇「本身爬本身的照片」的博客的朋友不知道對這個流程是否還有印象,是否還有疑慮啊,這麼麻煩的操做,到處體現着人的干預,機器怎麼搞?你不登陸,你不保存,你不去找網址,怎麼拿到cookies嘛。服務器

能問出這種問題的小夥伴(真的有)啊,我只能說你腦子挺活絡的,可是不要跑偏了,上面你這幾個問題,都是有技術手段能夠解決的,可是咱們讓爬蟲可以登陸本身的帳號,就幹不了不少事情嗎?工具在你手上。cookie


什麼是cookies?什麼是session?

cookie: 在網站中,http請求是無狀態的,也就是說,即便第一次和服務器鏈接後而且登陸成功後,第二次請求服務器依然不能知道當前請求是哪一個用戶。cookie的出現就是爲了解決這個問題:當瀏覽器訪問網站後,這些網站將一組數據存放在客戶端,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動攜帶給服務器,服務器經過瀏覽器攜帶的數據就能識別當前用戶。

通常爲網頁存在本地的一些數據,用來下次訪問時回傳驗證,經常使用於登錄驗證,記住狀態

session: Session是存放在服務器端的相似於HashTable的結構來存放用戶 數據,當瀏覽器第一次發送請求時,服務器自動生成了一個HashTable和一個Session ID用來惟一標識這個HashTable,並將其經過響應發送到瀏覽器。當瀏覽器第二次發送請求,會將前一次服務器響應中的Session ID放在請求中一併發送到服務器上,服務器從請求中提取出Session ID,並和保存的全部Session ID進行對比,找到這個用戶對應的HashTable。

相似於客戶機本地的cookie,session爲服務器的’cookie’,能夠實現同樣的功能,每每還能夠一同交互驗證登錄,記住狀態

是如何實現「記住個人登陸狀態」的功能

因此咱們能夠知道,若是將Session ID經過Cookie發送到客戶端的時候設置其有效時間爲1年,那麼在從此的一年時間內,客戶端訪問個人網站的時候都回將這個Session ID值發送到服務器上,服務器根據這個Session ID從內存或者數據庫裏面恢復存放Key-Value對的HashTable。

可是,服務器上的Session其實不會保存。過了必定的時間以後,服務器上的Session就會被銷燬,以減輕服務器的訪問壓力。當服務器上的數據被銷燬後,即便客戶端上存放了cookie也沒有辦法「記住個人登陸狀態」了。

因此,本文方法只是短時間驗證cookie跳過登錄驗證訪問之用,本地的cookie失效時間主要和服務器上session設置的時間有關。


post請求

什麼是post請求?若是你沒據說過post請求,那麼就想一下get請求吧。

其實,post和get均可以帶着參數請求,不過get請求的參數會在url上顯示出來。

但post請求的參數就不會直接顯示,而是隱藏起來。像帳號密碼這種私密的信息,就應該用post的請求。

一般,get請求會應用於獲取網頁數據,好比咱們以前學的requests.get()。post請求則應用於向網頁提交數據,好比提交表單類型數據(像帳號密碼就是網頁表單的數據)。


實操第一步

打開CSDN的登陸頁面,填上你的我的信息:https://passport.csdn.net/login?code=public

 

該勾的勾,該選的選,而後點擊登陸。

 

你猜是哪一個包啊,耍點小聰明啊,你看你登陸成功以後,右邊還在不斷的加載包,那就能夠斷定登陸包確定在前邊。
點擊登陸以後,信號一傳送,第一步確定是登陸,因此就前幾個包看一下,一眼就看到了那個「doLogin」吧,點開。

 


看到沒,post、

 

內啥,看到一大串的set-cookies了嗎?沒別的意思,我就提一下哈哈哈哈哈哈。

 

吶,我給你畫出來了。
上面我提那一下啊,其實我是想說,都打開,不一樣網站不同,指不定在哪一個小角落裏發現了你的小餅乾呢。

其實不止小餅乾啊,帳號密碼都有:

 

咱們來試試另外一種登陸方式,帶參登陸。

import requests #引入requests。 url = 'https://www.csdn.net/' #把請求登陸的網址賦值給url。 headers = { 'origin':'https://passport.csdn.net', # 請求來源,本案例中實際上是不須要加這個參數的,只是爲了演示 'referer':'https://passport.csdn.net/login', 'User-Agent':'省略' } #加請求頭,前面有說過加請求頭是爲了模擬瀏覽器正常的訪問,避免被反爬蟲。 data = { "loginType": "1", "pwdOrVerifyCode": "密碼", "userIdentification":"帳號" } #把有關登陸的參數封裝成字典,賦值給data。 login_in = requests.post(url,headers=headers,data=data) print(login_in) 123456789101112131415161718192021

好的,返回值403,草率了。。
沒事了,沒事了。


鋒迴路轉

哦,我又不斷地嘗試了,終於成功的登陸上了:

import requests from bs4 import BeautifulSoup header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36', 'Connection': 'keep-alive', 'accept': 'application/json, text/plain, */*', #'Cookie': cookie, 'referer': 「個人博客」頁面網址 } url = 上面那個referer data = { "loginType": "1", "pwdOrVerifyCode": 你的, "userIdentification":你的 } #把有關登陸的參數封裝成字典,賦值給data。 login_in = requests.post(url,headers=header,data=data) print(login_in) 1234567891011121314151617181920212223

好極,此次返回值是200了。

接下來幹嗎?接下來找一篇博客評論一下這事兒就算過去了。

cookies = login_in.cookies
#提取cookies的方法:調用requests對象(login_in)的cookies屬性得到登陸的cookies,並賦值給變量cookies。 url_1 = 本身找 #咱們想要評論的文章網址。 data_1 = { 'content': 'test', 'articleId':我的填 } #把有關評論的參數封裝成字典。 comment = requests.post(url_1,headers=header,data=data_1,cookies=cookies) #用requests.post發起發表評論的請求,放入參數:文章網址、headers、評論參數、cookies參數,賦值給comment。 #調用cookies的方法就是在post請求中傳入cookies=cookies的參數。 print(comment.status_code) #打印出comment的狀態碼,若狀態碼等於200,則證實咱們評論成功。 123456789101112131415

以狀態碼爲準,有時候慢起來要等一天你才能看獲得。

若是真等了一天還評論不上去,沒事,我跟你說,那應該是被後臺給切了。
沒事,咱們後面還會有更好的辦法。

把小餅乾裝進餅乾盒

算了,爲了看着直觀,我仍是把以前那段爬學生證的代碼節選一下吧。

import requests from bs4 import BeautifulSoup cookie = '''*此處粘貼從chrome中複製的cookie信息*''' header = { 'User-Agent': '放你本身的', 'Connection': 'keep-alive', 'accept': '放你本身的', 'Cookie': cookie, 'referer': '放你本身的博客主頁地址' } url = 'https://blog.csdn.net/python_miao?spm=1010.2135.3001.5113' # csdn 我的中心中,加載名字的js地址 seesion = requests.session() response = seesion.get(url,headers=header) print(type(session.cookies)) #打印cookies的類型,session.cookies就是登陸的cookies 123456789101112131415

好極,能夠看到結果是:<class ‘requests.cookies.RequestsCookieJar’>

這玩意兒怕是不能存到文本里面吧,誰去試一下看看。

不過仔細觀察一下吧,這個cookies有沒有長得挺像一個字典型字符串啊

 

本身動手啊,我就說要一句:其實不用轉字符串也能夠試一下,不行了再轉也不遲。


固然了,還有其餘的方式獲取到cookies,不過我這套方法是最直接的了。


自動化實現:selenium

如今的網站啊,也都不是傻子,哪一個登陸不要你驗證碼的?極少數吧。
那這驗證碼不就得你手動去輸入了,固然,也有人說什麼機器學習啊,破解驗證碼啊,想法不錯,動手試試嘛。

還有的網站啊,想必你也碰到過吧,阡陌交通,錯綜複雜的,爬個球啊爬。

就更不要說那些URL加密了啊,或者直接禁止爬蟲的網站了。

好,接下來咱們就來看看這項即將要接觸的新技術:selenium可以幫助咱們闖過多少障礙。

先展現一下

粗略展現一下,打開瀏覽器,打開一篇博客,而後關掉,至於其餘高端操做,咱們後面經過代碼來展現:

 

代碼展現

# 本地Chrome瀏覽器設置方法 from selenium import webdriver import time driver = webdriver.Chrome() driver.get('https://mp.toutiao.com/profile_v4/graphic/articles') time.sleep(2) driver.get('https://www.toutiao.com/i6887003700720566795/') time.sleep(2) driver.close() 1234567891011121314

代碼給大家,大家拿去試試看,多半是運行不起來的,由於大家多半沒有配置環境。

環境配置

好,沒環境都不用着急,一切都會如期而至的嘛。

首先,你須要一個谷歌瀏覽器,一直在說,應該沒有小夥伴還沒下載吧。
其次,你須要看一下你的谷歌瀏覽器的版本,這個很重要,由於一代版本對應的是一代驅動,匹配不上的話問題就會有點麻煩了。
接下來,咱們來下載一個驅動:http://npm.taobao.org/mirrors/chromedriver/
版本本身挑啊。

下載完以後,解壓,把這個驅動放到Python安裝的同級目錄下,若是不知道是哪一個,那就下載了有多少個Python安裝嫌疑目錄就放多少個唄。

好,再打開pycharm,運行前面的代碼。

哦,對了,你還要下載一個selenium的包,還有點大。


今天不講太多的操做,就開個頭,字數也八千多了,把好玩的東西都留到下一篇嘛。

那接下來來說一下上面那幾行代碼,開個好頭,我知道,可能會有小夥伴接着就本身去查了啊。


selenium簡單講解

設置瀏覽器引擎

#第一步,導入模塊,不過多贅述 from selenium import webdriver import time driver = webdriver.Chrome() #獲取對谷歌瀏覽器的控制權,這裏若是沒有驅動的話是會直接報錯的 driver.get('') #命令谷歌瀏覽器:嘿,小樣兒,給我打開這個網頁 time.sleep(2) #主要是由於瀏覽器慢了點,仍是說網絡慢了點,反正就是有延遲,你等兩秒唄。 driver.get('https://lion-wu.blog.csdn.net/article/details/109244401') #再開一個 time.sleep(2) #同上 driver.close() #行了,玩到這裏,關了 123456789101112

selenium能幹嗎?

我就這麼說吧,上面這一段,把Chrome瀏覽器設置爲引擎,而後賦值給變量driver。driver是實例化的瀏覽器,在後面你會老是能看到它的影子,這也能夠理解,由於咱們要控制這個實例化的瀏覽器爲咱們作一些事情。

你懂得。

爲何selenium這麼能幹?

selenium能把咱們前面遇到的問題簡化,爬動態網頁如爬靜態網頁同樣簡單。

剛開始咱們直接用BeautifulSoup就能處理掉的那種網頁,就是靜態網頁。咱們使用BeautifulSoup爬取這類型網頁,由於網頁源代碼中就包含着網頁的全部信息,所以,網頁地址欄的URL就是網頁源代碼的URL。

後來,咱們開始接觸更復雜的網頁,我要是沒有記錯的話,咱是從抓取CSDN的評論開始的吧,那時候咱們開始接觸到了json。
還有後面的QQ音樂,要爬取的數據不在HTML源代碼中,而是在json中,你就不能直接使用網址欄的URL了,而須要找到json數據的真實URL。這就是一種動態網頁。

不論數據存在哪裏,瀏覽器老是在向服務器發起各式各樣的請求,當這些請求完成後,它們會一塊兒組成開發者工具的Elements中所展現的,渲染完成的網頁源代碼。

在遇到頁面交互複雜或是URL加密邏輯複雜的狀況時,selenium就派上了用場,它能夠真實地打開一個瀏覽器,等待全部數據都加載到Elements中以後,再把這個網頁當作靜態網頁爬取就行了。

說了這麼多優勢,使用selenium時,固然也有美中不足之處。
因爲要真實地運行本地瀏覽器,打開瀏覽器以及等待網渲染完成須要一些時間,selenium的工做不可避免地犧牲了速度和更多資源,不過,至少不會比人慢。因此上面讓你等着,年輕人嘛,寧停三分鐘,不搶一秒鐘嘛。


就到這裏啊,留點懸念嘛。

 

最後多說一句,想學習Python可聯繫小編,這裏有我本身整理的整套python學習資料和路線,想要這些資料的均可以進q裙947618024領取。

本文章素材來源於網絡,若有侵權請聯繫刪除。

相關文章
相關標籤/搜索