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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬虫实战学习笔记_2 网络请求urllib模块+设置请求头+Cookie+模拟登陆

發(fā)布時間:2024/7/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫实战学习笔记_2 网络请求urllib模块+设置请求头+Cookie+模拟登陆 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 urllib模塊

1.1 urllib模塊簡介

Python3中將urib與urllib2模塊的功能組合,并且命名為urllib。Python3中的urllib模塊中包含多個功能的子模塊,具體內(nèi)容如下。

  • urllib.request:用于實現(xiàn)基本HTTP請求的模塊。
  • urlb.error:異常處理模塊,如果在發(fā)送網(wǎng)絡(luò)請求時出現(xiàn)了錯誤,可以捕獲的有效處理。
  • urllib.parse:用于解析URL的模塊。
  • urllib.robotparser:用于解析robots.txt文件,判斷網(wǎng)站是否可以爬取信息。

1.2 發(fā)送網(wǎng)絡(luò)請求urllib.request.urlopen()

1.2.1 urllib.request.urlopen()函數(shù)簡介

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
  • url:需要訪問網(wǎng)站的URL完整地址
  • data:該參數(shù)默認(rèn)為None,通過該參數(shù)確認(rèn)請求方式,如果是None,表示請求方式為GET,否則請求方式為POST。在發(fā)送POST請求時,參數(shù)daa需要以字典形式的數(shù)據(jù)作為參數(shù)值,并且需要將字典類型的參數(shù)值轉(zhuǎn)換為字節(jié)類型的數(shù)據(jù)才可以實現(xiàn)POST請求。
  • timeout:設(shè)置網(wǎng)站訪問超時時間,以秒為單位。
  • cafile:指定包含CA證書的單個文件,
  • capah:指定證書文件的目錄。
  • cadefault:CA證書默認(rèn)值
  • context:描述SSL選項的實例。

1.2.2 發(fā)送GET請求

import urllib.request response = urllib.request.urlopen("https://www.baidu.com/") print("response:",response) # 輸出: response: <http.client.HTTPResponse object at 0x000001AD2793C850>

1.2.3 獲取狀態(tài)碼、響應(yīng)頭、獲取HTMl代碼?

import urllib.request url = "https://www.baidu.com/" response = urllib.request.urlopen(url=url) print("響應(yīng)狀態(tài)碼:",response.status) # 輸出: 響應(yīng)狀態(tài)碼: 200 print("響應(yīng)頭信息:",response.getheaders()) # 響應(yīng)頭信息: [('Accept-Ranges', 'bytes'), ('Cache-Control', 'no-cache'), ('Content-Length', '227'), ('Content-Type', 'text/html'), ('Date', 'Wed, 09 Mar 2022 10:45:04 GMT'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('Pragma', 'no-cache'), ('Server', 'BWS/1.1'), ('Set-Cookie', 'BD_NOT_HTTPS=1; path=/; Max-Age=300'), ('Set-Cookie', 'BIDUPSID=5C4759402F5A8C38E347A1E6FB8788EF; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'PSTM=1646822704; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'BAIDUID=5C4759402F5A8C384F12C0C34D5D3B36:FG=1; max-age=31536000; expires=Thu, 09-Mar-23 10:45:04 GMT; domain=.baidu.com; path=/; version=1; comment=bd'), ('Strict-Transport-Security', 'max-age=0'), ('Traceid', '1646822704264784359414774964437731406767'), ('X-Frame-Options', 'sameorigin'), ('X-Ua-Compatible', 'IE=Edge,chrome=1'), ('Connection', 'close')] print("響應(yīng)頭指定信息:",response.getheader('Accept-Ranges')) # 響應(yīng)頭指定信息: bytes print("目標(biāo)頁面的Html代碼 \n ",response.read().decode('utf-8')) # 即為Html文件的內(nèi)容

1.2.4 發(fā)送POST請求

urlopen()方法在默認(rèn)的情況下發(fā)送的是GET請求,如果需要發(fā)送POST請求,可以為其設(shè)置data參數(shù)、該參數(shù)是byte類型,需要使用bytes()方法將參數(shù)值進行數(shù)據(jù)類型轉(zhuǎn)換

import urllib.request import urllib.parseurl = "https://www.baidu.com/" data = bytes(urllib.parse.urlencode({'hello':'python'}),encoding='utf-8') # 將表單轉(zhuǎn)化為bytes類型,并且設(shè)置編碼 response = urllib.request.urlopen(url=url,data=data,timeout=0.1) # 發(fā)送網(wǎng)絡(luò)請求 設(shè)置超時時間0.1s print(response.read().decode('utf-8')) # 讀取Html代碼進行編碼

1.2.5 處理網(wǎng)絡(luò)超市異常

如果遇到了超時異常,爬蟲程序?qū)⒃诖颂幫V埂K栽趯嶋H開發(fā)中開發(fā)者可以將超時異常捕獲,然后處理下面的爬蟲任務(wù)。以上述發(fā)送網(wǎng)絡(luò)請求為例,將超時參數(shù)imeout設(shè)置為0.1s,然后使用try...excpt 捕獲異常并判斷如果是超時異常就模擬自動執(zhí)行下一個任務(wù)。

import urllib.request import urllib.error import socketurl = "https://www.baidu.com/"try:response = urllib.request.urlopen(url=url,timeout=0.1)print(response.read().decode('utf-8')) except urllib.error.URLError as error :if isinstance(error.reason,socket.timeout):print("當(dāng)前任務(wù)已經(jīng)超時,即將執(zhí)行下一任務(wù)")

2 設(shè)置請求頭

2.1?urllib.request.Request()

urlopen()方法可以實現(xiàn)最基本的請求的發(fā)起,但如果要加入Headers等信息,就可以利用Request類來構(gòu)造請求。

2.1.1 函數(shù)原型
使用方法為:

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

2.1.2 參數(shù)解析

  • url:要請求的URL地址
  • data?:必須是bytes(字節(jié)流)類型,如果是字典,可以用urllib.parse模塊里的urlencode()編碼
  • headers:是一個字典類型,是請求頭。①在構(gòu)造請求時通過headers參數(shù)直接構(gòu)造,也可以通過調(diào)用請求實例的add_header()方法添加。②通過請求頭偽裝瀏覽器,默認(rèn)User-Agent是Python-urllib。要偽裝火狐瀏覽器,可以設(shè)置User-Agent為Mozilla/5.0 (x11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11
  • origin_req_host:指定請求方的host名稱或者ip地址
  • unverifiable:設(shè)置網(wǎng)頁是否需要驗證,默認(rèn)是False,這個參數(shù)一般也不用設(shè)置。
  • method?:字符串,用來指定請求使用的方法,比如GET,POST和PUT等。

2.1.3 設(shè)置請求頭的作用

請求頭參數(shù)是為了模擬瀏覽器向網(wǎng)頁后臺發(fā)送網(wǎng)絡(luò)請求,這樣可以避免服務(wù)器的反爬措施。使用urlopen()方法發(fā)送網(wǎng)絡(luò)請求時,其本身并沒有設(shè)置請求頭參數(shù),所以向測試地址發(fā)送請求時,返回的信息中headers將顯示默認(rèn)值。

所以在設(shè)置請求頭信息前,需要在瀏覽器中找到一個有效的請求頭信息。以谷歌瀏覽器為例2

2.1.4 手動尋找請求頭

F12打開開發(fā)工具,選擇 Network 選項,接著任意打開一個網(wǎng)頁,在請求列表中找到Headers選項中找到請求頭。

?2.2 設(shè)置請求頭

import urllib.request import urllib.parse url = "https://www.baidu.com/" # 設(shè)置請求地址 #設(shè)置請求頭信息 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"} # data轉(zhuǎn)化為bytes類型,并設(shè)置編碼方式 data = bytes(urllib.parse.urlencode({'hello':'python'}),encoding='utf-8') # 創(chuàng)建Request類型對象 url_post = urllib.request.Request(url=url,data=data,headers=headers,method='POST') # 發(fā)送網(wǎng)絡(luò)請求 response = urllib.request.urlopen(url_post) # 讀取HTMl代碼并進行UTF-8編碼 print(response.read().decode('utf-8'))

3 Cookie

? ?Cookie是服務(wù)器向客戶端返回響應(yīng)數(shù)據(jù)時所留下的標(biāo)記,當(dāng)客戶端再次訪問服務(wù)器時將攜帶這個標(biāo)記。一般在實現(xiàn)登錄一個頁面時,登錄成功后,會在瀏覽器的Cookie中保留一些信息,當(dāng)瀏覽器再次訪問時會攜帶Cook中的信息,經(jīng)過服務(wù)器核對后便可以確認(rèn)當(dāng)前用戶已經(jīng)登錄過,此時可以直接將登錄后的數(shù)據(jù)返回。
? ? 在使用網(wǎng)絡(luò)爬蟲獲取網(wǎng)頁登錄后的數(shù)據(jù)時,除了使用模擬登錄以外,還可以獲取登錄后的Cookie,然后利用這個Cookie再次發(fā)送請求時,就能以登錄用戶的身份獲取數(shù)據(jù)。

3.1 模擬登陸

3.1.1 登陸前準(zhǔn)備

目標(biāo)地址:site2.rjkflm.com:666

賬號:test01test

密碼:123456

3.1.2 查看登陸目標(biāo)地址

得到以下信息

Request URL:http://site2.rjkflm.com:666/index/index/login.html

3.1.2 實現(xiàn)模擬登陸

import urllib.request import urllib.parseurl = "http://site2.rjkflm.com:666/index/index/chklogin.html" # 設(shè)置表單 data = bytes(urllib.parse.urlencode({'username':'test01test','password':'123456'}),encoding='utf-8') # 將bytes轉(zhuǎn)化,并且設(shè)置編碼 r = urllib.request.Request(url=url,data=data,method='POST') response = urllib.request.urlopen(r) # 發(fā)送請求 print(response.read().decode('utf-8')) # 返回:{"status":true,"msg":"登錄成功!"}

3.1.3 獲取Cookies

import urllib.request import urllib.parse import http.cookiejar import jsonurl = "http://site2.rjkflm.com:666/index/index/chklogin.html" # 設(shè)置表單 data = bytes(urllib.parse.urlencode({'username':'test01test','password':'123456'}),encoding='utf-8')cookie_file = 'cookie.txt' cookie = http.cookiejar.LWPCookieJar(cookie_file) # 創(chuàng)建LWPCookieJar對象 # 生成 Cookie處理器 cookie_processor = urllib.request.HTTPCookieProcessor(cookie) # 創(chuàng)建opener對象 opener = urllib.request.build_opener(cookie_processor) response = opener.open(url,data=data) # 發(fā)送網(wǎng)絡(luò)請求 response = json.loads(response.read().decode('utf-8'))['msg'] if response == '登陸成功':cookie.save(ignore_discard=True,ignore_expires=True) # 保存Cookie文件

3.1.4?載入Cookies

import urllib.request import http.cookiesimport urllib.request # 導(dǎo)入urllib.request模塊 import http.cookiejar # 導(dǎo)入http.cookiejar子模塊 # 登錄后頁面的請求地址 url = 'http://site2.rjkflm.com:666/index/index/index.html' cookie_file = 'cookie.txt' # cookie文件cookie = http.cookiejar.LWPCookieJar() # 創(chuàng)建LWPCookieJar對象 # 讀取cookie文件內(nèi)容 cookie.load(cookie_file,ignore_expires=True,ignore_discard=True) # 生成cookie處理器 handler = urllib.request.HTTPCookieProcessor(cookie) # 創(chuàng)建opener對象 opener = urllib.request.build_opener(handler) response = opener.open(url) # 發(fā)送網(wǎng)絡(luò)請求 print(response.read().decode('utf-8')) # 打印登錄后頁面的html代碼

總結(jié)

以上是生活随笔為你收集整理的爬虫实战学习笔记_2 网络请求urllib模块+设置请求头+Cookie+模拟登陆的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。