通過urlopen來進行獲取
requset.urlopen(url,data,timeout)
第一個引數url即為URL,第二個引數data是存取URL時要傳送的資料,第三個timeout是設定超時時間。
第二三個引數是可以不傳送的,data預設為空None,timeout預設為 socket._GLOBAL_DEFAULT_TIMEOUT
第一個引數URL是必須要加入的,執行urlopen方法之後,返回一個response物件,返回資訊便儲存在這裡面
from urllib.request import urlopen
url = "https://www.baidu.com/"
respons = urlopen(url)#最簡單的爬取情況這樣爬取大部分網頁無法爬取成功
response.read()
read()方法就是讀取檔案裡的全部內容,返回bytes型別
print(type(respons.read()))#結果為bytes型別所以需要進行轉碼
print(type(respons.read().decode()))#通過decode轉碼結果為str
response.getcode()
返回 HTTP的響應碼,成功返回200,4伺服器頁面出錯,5伺服器問題
response.geturl()
返回 返回實際資料的實際URL,防止重定向問題
response.info()
返回 伺服器響應的HTTP報頭
Request物件,由於urlopen引數可以傳入一個request請求(可以理解成為再加一步封裝的功能)因為在構建請求時還需要加入好多內容,通過構建一個request,伺服器響應請求得到應答,這樣顯得邏輯上清晰明確
from urllib.request import urlopen,Request
from fake_useragent import UserAgent#這個包可以隨機生成User-Agent
url = "https://www.baidu.com/"
headers = {"User-Agent":UserAgent().firefox}#生成火狐的
request = Request(url,headers=headers)
response = urlopen(request)
a=response.read().decode()
瀏覽器通過GET方法發出請求
爬蟲主要通過get再url中加入請求的引數,由於中文的需要轉碼通過
Urllib.parse.urlencode() 針對多個引數進行轉碼操作輸入格式為字典型別
Urllib.parse.quote() 針對單個字串進行轉碼操作
Str格式.format( ) 用於拼接字串
一般在需要登入的地方用的比較多
需要在request請求中加如一個data用來傳入引數
引數的形式要以字典格式通過urllib.parse.urlencode()進行轉換成字串形式
再通過encode()函數對字串進行轉碼(預設值就可以)
傳送請求/響應header頭的含義
名稱 | 含義 |
---|---|
Accept | 告訴伺服器,使用者端支援的資料型別 |
Accept-Charset | 告訴伺服器,使用者端採用的編碼 |
Accept-Encoding | 告訴伺服器,客戶機支援的資料壓縮格式 |
Accept-Language | 告訴伺服器,客戶機的語言環境 |
Host | 客戶機通過這個頭告訴伺服器,想存取的主機名 |
If-Modified-Since | 客戶機通過這個頭告訴伺服器,資源的快取時間 |
Referer | 客戶機通過這個頭告訴伺服器,它是從哪個資源來存取伺服器的。(一般用於防盜鏈) |
User-Agent | 客戶機通過這個頭告訴伺服器,客戶機的軟體環境 |
Cookie | 客戶機通過這個頭告訴伺服器,可以向伺服器帶資料 |
Refresh | 伺服器通過這個頭,告訴瀏覽器隔多長時間重新整理一次 |
Content-Type | 伺服器通過這個頭,回送資料的型別 |
Content-Language | 伺服器通過這個頭,告訴伺服器的語言環境 |
Server | 伺服器通過這個頭,告訴瀏覽器伺服器的型別 |
Content-Encoding | 伺服器通過這個頭,告訴瀏覽器資料採用的壓縮格式 |
Content-Length | 伺服器通過這個頭,告訴瀏覽器回送資料的長度 |
用於提取動態的頁面 網頁資料根據拖動進行顯示
通過瀏覽器工具箱,查詢包的資訊,找到url的規律進行爬取
如果無法知道要回圈多少次則規定一個死迴圈,爬取頁面為空時停止迴圈
也可以通過改變url一次性輸出更多的網頁資訊(只要伺服器允許)
因為在有些瀏覽器中存在很多證書所以在大部分網頁爬取的時候不用改變證書或者新增證書但有些自己寫證書的網站需要進行這一步操作
https請求=在http上加ssl,http請求是明文直接可以看見,為了安全要加上ssl
可以選擇忽略證書進行爬取 context = ssl._create_unverified_context()