日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python爬虫分析模拟登录时会变的参数_Python爬虫之urllib模拟登录及cookie的那点事...

發布時間:2023/12/20 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬虫分析模拟登录时会变的参数_Python爬虫之urllib模拟登录及cookie的那点事... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在web? sprider crawl過程中,許多網站都需要登錄后才能訪問,一般如果我們不用爬蟲框架的前提下,常規用的就兩個庫 ,urllib庫和requests庫,本文將用最基礎的urllib庫,以模擬登錄人人網為例,理清爬蟲過程中登錄訪問和cookie的思緒。

1.終極方案,也是最簡單粗暴最有效的方式。直接手動登錄,提取cookie,下次訪問直接在請求頭攜帶cookie

我們知道,網站辨別用戶身份和保持會話的常用方式就是cookie和session,用戶登錄成功,服務器返回一些特定字符串保存在本地瀏覽器中(cookie),瀏覽器下次訪問會直接攜帶cookie,這樣服務器就可以根據返回的cookie驗證訪問者身份。通常如果用瀏覽器正常訪問,這部分事情瀏覽器會幫我們去做。但是在程序模擬登? 錄時候,攜帶cookie就需要手動攜帶了。話不多說,直接進入主題。

打開人人網登錄界面,填入自己正確的用戶名和密碼,成功登陸進去。

其中紅色框的就是服務器給你的cookie,你的cookie就是以這樣的形式在request請求頭中的。直接將其復制粘貼下來,放入代碼中。上程序:

"""首先手動登錄人人網,然后獲取cookie"""

from urllib.request importurlopen, Request

headers={'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',#'Accept-Encoding': 'gzip, deflate', 這部分通常注釋掉,因為這部分是高訴服務器,本地支持的壓縮類型,因為瀏覽器會自動幫我們解壓,但是在程序中,沒辦法解壓,所以請求頭就不攜帶了

'Accept-Language': 'zh-CN,zh;q=0.9','Connection': 'keep-alive','Cookie': 'anonymid=kcpawuyd33irh2a;depovince=GW;r01_=1; JSESSIONID=abcGzDX6FRQNVfwdUETBnx;ick_login=6a732399-3adf-471b-af92-9bd68299d515; \

taihe_bi_sdk_uid=e4c3ee72270319312dde3088eb04c0be; taihe_bi_sdk_sefssion=6722a32d96ebbf8fd565fc7cc7f8f789;ick=1048bb79-0d32-46ab-8a11-af0c7e4cfa51;first_login_flag=1; \

ln_uact=17795796865;ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; ga=GA1.2.2124318841.1594975538;gid=GA1.2.506855365.1594975538; \

wp_fold=0;jebecookies=3833d4fe-20b3-4ecf-9efc-df9aca93641e|||||;de=5C6d0B07AA3EB53E377A21F126C928EF0; p=d3ae1effe255d4e057ef37f5682ac4850;\

t=ba23da27a155cc2b84a43307e83b37a70;societyguester=ba23da27a155cc2b84a4f3307e83b37a70;id=974774570;xnsid=a3c6bde2;ver=7.0;loginfrom=null','Host': 'www.renren.com','Referer': 'http://www.renren.com/974774570/profile''Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'}

url= 'http://www.renren.com/974774570/profile' #個人主頁request= Request(url=url, headers=headers)

response=urlopen(request)print(response.read().decode())

注釋:程序的headers 是一個字典,是通過登錄后抓包來的如下:

其實通常我們只需要攜帶圖中的兩個參數,cookie和User-Agent,,某些get請求中,只需偽裝User_agent即可。但是我為什么帶這么多呢,那是因為,在有的網站你抓取的過程中,你其他參數都配置完美,但是總是抓取錯誤,那么問題八九不離十出現在headers中,始終記住我們是用程序模擬瀏覽器訪問服務器,說明程序偽裝的還不夠完美。

那么這時候就要考慮headers中是否缺失了某些頭部信息。為了防止出錯,干脆全盤端過來,反正你瀏覽器訪問的時候就是帶的這些請求頭參數。但是要注意,請求頭Accept-Encoding (程序中已經交代清楚)和?Content-Length(這是瀏覽器計算出的長度,程序模擬沒辦法計算,所以注釋掉)通常注釋掉。

HTTP請求中的常用消息頭

accept:瀏覽器通過這個頭告訴服務器,它所支持的數據類型

Accept-Charset: 瀏覽器通過這個頭告訴服務器,它支持哪種字符集

Accept-Encoding:瀏覽器通過這個頭告訴服務器,支持的壓縮格式

Accept-Language:瀏覽器通過這個頭告訴服務器,它的語言環境

Host:瀏覽器通過這個頭告訴服務器,想訪問哪臺主機

If-Modified-Since: 瀏覽器通過這個頭告訴服務器,緩存數據的時間

Referer:瀏覽器通過這個頭告訴服務器,客戶機是哪個頁面來的? 防盜鏈

Connection:瀏覽器通過這個頭告訴服務器,請求完后是斷開鏈接還是何持鏈接

Content-Length:瀏覽器通過這個頭告訴服務器發出去的字節長度

2. 模擬登錄,然后訪問主頁(在程序中我們不需要關心cookie是如何如何的,opener對象會自動幫我們處理,與之對應的是方式3,見下文)

通過抓包如上圖,分析登錄post請求的地址和攜帶的參數

直接上代碼:

"""真正的模擬登錄是:發送post請求之后,保存cookie,之后訪問攜帶cookie"""# http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2020652227884 通過這13位數,我們可以以男人的直覺,嗅出這是精確到毫秒的時間戳,那m我們給他生成就是

url= 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp={}' # 登錄地址

importtimefrom urllib.request importRequest, urlopen, HTTPCookieProcessor, build_opener, ProxyHandlerfrom urllib.parse importurlencodefrom http.cookiejar importCookieJar, MozillaCookieJar#1. 創建cookiejar對象,這一種方式不用手動保存cookie,后期直接調用同一個opener即可,因為cookie已經在opener對象中

cookiejar =CookieJar()#2.通過cookiejar創建一個handler

handler =HTTPCookieProcessor(cookiejar)#handler1 = ProxyHandler({'http': '182.101.207.11:8080'}) # 選擇是否需要代理(自己設定代理)#3.根據handler創建一個opener

opener = build_opener(handler) #build_opener以傳遞多個handler對象,如果需要代理,則將handler1也傳入

unique_time = int(time.time() * 1000) #生成時間戳

headers={'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'}

data={'email': '17795796865','icode': '','origURL': 'http://www.renren.com/home','domain': 'renren.com','key_id': '1','captcha_type': 'web_login',#此處密碼是經過目標網站加密,不能直接放置原生密碼,加密密碼可以用瀏覽器抓包獲取

'password': '4af866303efsdf40a11d9f01e9677f3374bb957f905790b62a7eaa1accaf0a634764a1','rkey': '1ad002b47d8446d446f8d76f5bb5ff66','f': 'http%3A%2F%2Fwww.renren.com%2F974774570%2Fnewsfeed%2Fphoto'}#4 創建request對象

request = Request(url=url.format(unique_time), headers=headers)#5.post方式提交登錄

respose = opener.open(request, data=urlencode(data).encode())print(respose.read().decode())print('*' * 50)#get方式訪問個人主頁

get_url = 'http://www.renren.com/974774570/profile'request= Request(url=get_url, headers=headers)

respose=opener.open(request)print(respose.read().decode())

注釋:data中的數,我們一個都不能少,因為post請求中,抓包可以看到,瀏覽器就帶的這么多參數。至于參數是什么意思,我們唯一能一眼看懂的就是email(用戶名)和password(密碼)。密碼是加密后的,一定不能寫原生密碼,加密后這一竄密碼可以用瀏覽器登錄抓包獲取。至于其他的參數,這就是爬蟲的難點,比如像大型的互聯網公司如淘寶,這里的data參數動輒幾十個,要破解相當有難度,我們暫且不需要關注這些,但是通常的網站我們稍作分析大概就能猜出來這里某個參數的意思,實在猜不出來,就原生不動的放著試著登錄。大不了登錄不進去我么可以采取上面的終極方案啊。始終記住,爬蟲工程師,獲取到網頁提取數據才是你的重點。不要把精力耗費到破解form_data中的參數上。

3.手動將cookie保存到本地文件中,后續請求中直接讀取該cookie文件即可

可能有的人就有疑問了,方式2既然能模擬登錄成功,那為什么還要手動保存在本地呢,豈不是多此一舉。凡事存在即合理。在爬蟲過程中,我們可以手動提取cookie,或者模擬登錄,但是在分布式爬蟲或者多臺機器同時爬取時候,如果讓每臺機器都要copy cookie,或者讓每臺機器都登錄一遍,這不是明智的選擇,那么只有事先將cookie保存在文件中,后續每臺機器的程序從文件中讀取即可。

程序和方式2的程序很相似:

importtimefrom fake_useragent importUserAgentfrom urllib.request importRequest, urlopen, HTTPCookieProcessor, build_opener, ProxyHandlerfrom urllib.parse importurlencodefrom http.cookiejar importCookieJar, MozillaCookieJarfrom time importsleep

url= 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp={}'

#模擬登錄

defsave_cookie():#1. 創建cookiejar對象

#cookiejar = CookieJar() # 這一種不用保存文件中,后期直接用同一個opener對象調用就行

cookiejar = MozillaCookieJar() #這種方式是將cookie保存文件中

#2.通過cookiejar創建一個handler

handler =HTTPCookieProcessor(cookiejar)#handler1 = ProxyHandler({'http': '182.101.207.11:8080'}) # 選擇是否需要代理

#3.根據handler創建一個opener

opener = build_opener(handler) #可以傳遞多個handler對象,如果需要代理,則將handler1也傳入

unique_time = int(time.time() * 1000) #生成時間戳

headers={'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'}

data={'email': '17795796865','icode': '','origURL': 'http://www.renren.com/home','domain': 'renren.com','key_id': '1','captcha_type': 'web_login',#此處密碼是經過目標網站加密,不能直接放置原生密碼,加密密碼可以用瀏覽器抓包獲取

'password': '4af866303e40a11901e9677f3374bb957f905790b62a7eaa1accaf0a634764a1','rkey': '1ad002b47d8446d446f8d76f5bb5ff66','f': 'http%3A%2F%2Fwww.renren.com%2F974774570%2Fnewsfeed%2Fphoto'}

request= Request(url=url.format(unique_time), headers=headers)

respose= opener.open(request, data=urlencode(data).encode())#創建保存可以序列化cookie的文件對象

cookiejar.save('cookiejar.txt', ignore_discard=True, ignore_expires=True)print(respose.read().decode())print('*' * 50)#訪問個人主頁

defuse_cookie():

get_url= 'http://www.renren.com/974774570/profile'headers={'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'}#1. 創建cookiejar

cookiejar =MozillaCookieJar()#2.從本地加載cookie文件

cookiejar.load('cookiejar.txt')#3.創建handler對象

handler =HTTPCookieProcessor(cookiejar)#4.創建opener對象

opener =build_opener(handler)#5.創建request對象

request = Request(url=get_url, headers=headers)#6.發送請求

respose =opener.open(request)print(respose.read().decode())if __name__ == '__main__':

save_cookie()

sleep(2)

use_cookie()

運行程序我們可以看到本地有個cookiejar.txt文件

總結

不管以哪種方式,我們的終極目的是為了爬取數據,而不是花里胡哨的模擬登陸,如果模擬登陸過程中幾次嘗試失敗,那么不妨可以直接放棄,直接以第一種方式即可。畢竟人生苦短!由于精力有限,此處就沒有涉及驗證碼,通常大多數網站登陸幾次失敗后就有驗證碼驗證。后續有機會再講。

總結

以上是生活随笔為你收集整理的python爬虫分析模拟登录时会变的参数_Python爬虫之urllib模拟登录及cookie的那点事...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。