欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python 爬蟲如何正確的使用cookie

 更新時間:2020年10月27日 08:57:50   作者:白42  
這篇文章主要介紹了python 爬蟲如何使用cookie,幫助大家繞過網(wǎng)站設置的登錄規(guī)則以及登錄時的驗證碼識別,完成自身的爬取需求,感興趣的朋友可以了解下

很多時候,我們要查看的內(nèi)容必須要先登錄才能找到,比如知乎的回答,QQ空間的好友列表、微博上關注的人和粉絲等。要使用爬蟲直接登錄抓取這些信息時,有一個不太好解決的難題,就是這些網(wǎng)站設置的登錄規(guī)則以及登錄時的驗證碼識別。不過,我們可以想辦法繞過去,思路是這樣的:先使用瀏覽器登錄,從瀏覽器獲取登錄后的“憑證”,然后將這個“憑證”放到爬蟲里,模擬用戶的行為繼續(xù)抓取。這里,我們要獲取的憑證就是cookie信息。

這次我們嘗試使用python和cookie來抓取QQ空間上的好友列表。使用的工具是FireFox瀏覽器、FireBug和Python。

獲取cookie

打開FireFox瀏覽器,登錄QQ空間,啟動FireBug,選擇FireBug中的Cookies頁簽,點擊頁簽中的cookies按鈕菜單,選擇“導出本站點的cookie”即可完成cookie的導出。

導出cookie會以一個名為cookies.txt文本文件形式存在。

程序?qū)崿F(xiàn)

然后我們會使用獲取的cookie新建一個opener來替換之前請求時使用的默認的opener。將獲取的cookies拷貝到程序目錄下,編寫腳本如下:

#!python
# encoding: utf-8
from http.cookiejar import MozillaCookieJar
from urllib.request import Request, build_opener, HTTPCookieProcessor
 
DEFAULT_HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"}
DEFAULT_TIMEOUT = 360
 
 
def grab(url):
    cookie = MozillaCookieJar()
    cookie.load('cookies.txt', ignore_discard=True, ignore_expires=True)
    req = Request(url, headers=DEFAULT_HEADERS)
    opener = build_opener(HTTPCookieProcessor(cookie))
    response = opener.open(req, timeout=DEFAULT_TIMEOUT)
    print(response.read().decode('utf8'))
 
 
if __name__ == '__main__':
    grab(<a  rel="external nofollow" >http://user.qzone.qq.com/QQ號/myhome/friends</a>)

因為我們使用的是FireFox瀏覽器導出的cookie文件,所以這里使用的cookieJar是MozillaCookieJar。

執(zhí)行腳本…然而報錯了:

Traceback (most recent call last):
  File "D:/pythonDevelop/spider/use_cookie.py", line 17, in <module>
    start()
  File "D:/pythonDevelop/spider/use_cookie.py", line 9, in start
    cookie.load('cookies.txt', ignore_discard=True, ignore_expires=True)
  File "D:\Program Files\python\python35\lib\http\cookiejar.py", line 1781, in load
    self._really_load(f, filename, ignore_discard, ignore_expires)
  File "D:\Program Files\python\python35\lib\http\cookiejar.py", line 2004, in _really_load
    filename)
http.cookiejar.LoadError: 'cookies.txt' does not look like a Netscape format cookies file

問題出在cookies文件上,說是不像一個Netscape格式的cookie文件。不過也好解決,只需要在cookies文件開始一行添加如下內(nèi)容即可:

# Netscape HTTP Cookie File

通過這行內(nèi)容提示python cookie解析器這是一個FireFox瀏覽器適用的cookie。

再次執(zhí)行,還是會報錯,因為比較長我就只貼關鍵的部分出來:

http.cookiejar.LoadError: invalid Netscape format cookies file 'cookies.txt': '.qzone.qq.com\tTRUE\t/\tFALSE\tblabla\tdynamic'

意思是cookie中某些行存在格式錯誤。具體錯在哪兒,需要先了解下FireFox瀏覽器的cookie格式。MozillaCookieJar認為每行cookie需要包含以下信息,每條信息以制表符分隔:

名稱 domain domain_specified path secure expires name value
類型 字符串 布爾型 字符串 布爾型 長整型 字符串 字符串
說明 域名 適用路徑 是否使用安全協(xié)議 過期時間 名稱

其中domain_specified是什么意思我不很清楚,以后弄明白了再補上。再來看看我們獲取的cookie的部分行:

user.qzone.qq.com	FALSE	/	FALSE	814849905_todaycount	0
user.qzone.qq.com	FALSE	/	FALSE	814849905_totalcount	0
.qzone.qq.com	TRUE	/	FALSE	1473955201	Loading	Yes
.qzone.qq.com	TRUE	/	FALSE	1789265237	QZ_FE_WEBP_SUPPORT	0

前兩行格式是錯誤的,后兩行格式是正確的。前兩行缺少“expires”屬性。該怎么辦呢——補上就好了唄。在其他的cookie中隨意選一個時間補上就OK了。

補全cookie后,再次執(zhí)行是正常的,沒有報錯。但是沒有如預期的打印出好友信息,因為網(wǎng)址錯了。使用firebug可以找出正確的網(wǎng)址:

https://h5.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin=QQ號&do=1&rd=0.44948123599838985&fupdate=1&clean=0&g_tk=515169388

這樣就抓取到好友列表了。好友列表是一個json字符串。

至于如何解析json,會在下一節(jié)進行說明。

動態(tài)獲取cookie

cookie是有過期時間的。如果想長時間抓取網(wǎng)頁,就需要每隔一段時間就更新一次cookie。如果都是從FireFox瀏覽器來手動獲取顯得有些笨了。從瀏覽器獲取的cookie只是作為一個入口,之后再進行請求還是要依靠python主動獲取cookie。下面是一段獲取cookie的程序:

#!python
# encoding: utf-8
from http.cookiejar import CookieJar
from urllib.request import Request, HTTPCookieProcessor, build_opener
 
DEFAULT_HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"}
DEFAULT_TIMEOUT = 360
 
 
def get(url):
    cookie = CookieJar()
    handler = HTTPCookieProcessor(cookie)
    opener = build_opener(handler)
    req = Request(url, headers=DEFAULT_HEADERS)
    response = opener.open(req, timeout=DEFAULT_TIMEOUT)
    for item in cookie:
        print(item.name + " = " + item.value)
    response.close()

在示例程序中演示了如何獲取cookie,并打印了cookie的name和value兩項屬性。通過實例可以看到每次執(zhí)行http請求都會重新獲取cookie,因此可以將我們的程序調(diào)整一下:執(zhí)行第一次請求時使用我們通過瀏覽器獲取的cookie,之后的每次請求都可以使用上次請求時獲取的cookie。調(diào)整后的程序:

#!python
# encoding: utf-8
from http.cookiejar import MozillaCookieJar, CookieJar
from urllib.request import Request, build_opener, HTTPCookieProcessor, urlopen
 
DEFAULT_HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"}
DEFAULT_TIMEOUT = 360
 
 
def gen_login_cookie():
    cookie = MozillaCookieJar()
    cookie.load('cookies.txt', ignore_discard=True, ignore_expires=True)
    return cookie
 
 
def grab(cookie, url):
    req = Request(url, headers=DEFAULT_HEADERS)
    opener = build_opener(HTTPCookieProcessor(cookie))
    response = opener.open(req, timeout=DEFAULT_TIMEOUT)
    print(response.read().decode("utf8"))
    response.close()
 
 
def start(url1, url2):
    cookie = gen_login_cookie()
    grab(cookie, url1)
    grab(cookie, url2)
 
 
if __name__ == '__main__':
    u1 = "https://user.qzone.qq.com/QQ號/myhome/friends"
    u2 = "https://h5.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin=QQ號&do=2&rd=0.44948123599838985&fupdate=1&clean=0&g_tk=515169388"
    start(u1, u2)

就這樣。

其他

其實在登錄QQ空間時使用cookie還有另一種法子——通過觀察,也可以在http 請求頭中添加cookie信息。

獲取請求頭中cookie的方式:打開FireFox瀏覽器,打開FireBug并激活FireBug的network頁簽,在FireFox瀏覽器上登錄QQ空間,然后在FireBug中找到登錄頁請求,然后就可以找到請求頭中的cookie信息了。

將cookie信息整理成一行,添加到請求頭中就可以直接訪問了。這個方法相對簡單,減少了修改cookie文件的步驟。

此外,在一篇博客文章中還找到了直接登錄QQ空間的方案。這算是已知最好的法子了,只要騰訊不改變登錄規(guī)則就能很簡單的執(zhí)行請求獲取cookie。不過年代久遠,不知規(guī)則是否還適用

以上就是python 爬蟲如何正確的使用cookie的詳細內(nèi)容,更多關于python 爬蟲使用cookie的資料請關注腳本之家其它相關文章!

相關文章

  • python之np.argmax()及對axis=0或者1的理解

    python之np.argmax()及對axis=0或者1的理解

    這篇文章主要介紹了python之np.argmax()及對axis=0或者1的理解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • python tkiner實現(xiàn) 一個小小的圖片翻頁功能的示例代碼

    python tkiner實現(xiàn) 一個小小的圖片翻頁功能的示例代碼

    這篇文章主要介紹了python tkiner實現(xiàn) 一個小小的圖片翻頁功能,需要的朋友可以參考下
    2020-06-06
  • Python之try無法使用全局變量的問題解決

    Python之try無法使用全局變量的問題解決

    當我們使用try語句時,如果在try中使用了全局變量,但又在except或finally中修改了這個全局變量,就會出現(xiàn)這種無法修改全局變量的情況,下面就來解決一下這個問題,感興趣的可以了解一下
    2024-08-08
  • Python 數(shù)據(jù)結(jié)構(gòu)之樹的概念詳解

    Python 數(shù)據(jù)結(jié)構(gòu)之樹的概念詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之樹的概念詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 為什么str(float)在Python 3中比Python 2返回更多的數(shù)字

    為什么str(float)在Python 3中比Python 2返回更多的數(shù)字

    很多朋友質(zhì)疑為什么str(float)在Python 3中比Python 2返回更多的數(shù)字,在Python 2.7中,一個float的repr返回最接近十七位數(shù)的十進制數(shù);這足以精確地識別每個可能的IEEE浮點值。對此問題很多朋友都很疑問,下面小編給大家簡單介紹下,需要的朋友可以參考下
    2018-10-10
  • Django中使用haystack+whoosh實現(xiàn)搜索功能

    Django中使用haystack+whoosh實現(xiàn)搜索功能

    這篇文章主要介紹了Django之使用haystack+whoosh實現(xiàn)搜索功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • 詳解Python開啟線程和線程池的方法

    詳解Python開啟線程和線程池的方法

    這篇文章主要介紹了Python開啟線程和線程池的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-03-03
  • Python爬蟲之獲取心知天氣API實時天氣數(shù)據(jù)并彈窗提醒

    Python爬蟲之獲取心知天氣API實時天氣數(shù)據(jù)并彈窗提醒

    今天我們來學習如何獲取心知天氣API實時天氣數(shù)據(jù),制作彈窗提醒,并設置成自啟動項目.文中有非常詳細的代碼示例及介紹,對正在學習python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • Python用SSH連接到網(wǎng)絡設備

    Python用SSH連接到網(wǎng)絡設備

    這篇文章主要介紹了Python用SSH連接到網(wǎng)絡設備,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-02-02
  • 如何使用python操作vmware

    如何使用python操作vmware

    這篇文章主要介紹了如何使用python操作vmware,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07

最新評論