爬蟲網路請求模組urllib
阿新 • • 發佈:2021-02-03
目錄
基本概念
- 客戶端向伺服器發起請求的兩種方式
- get 查詢引數會在url顯示出來,把引數資料佇列加到提交表單的ACTION屬性所指的URL中,值和表單內各個欄位一一對應,在URL中可以看到。傳送的資料量較小,不能大於2KB,安全性非常低
- post 查詢引數是不會顯示在url地址之上的。通過HTTP post機制,將表單內各個欄位與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。使用者看不到這個過程。傳送的資料量較大,一般被預設為不受限制,安全性較高。
- 如果沒有加密,兩種方式安全級別都是一樣的,監聽器都可以把所有的資料監聽到。
- url:統一資源定位符( uniform resource locator)
https://new.qq.com/omn/TWF20200/TWF2020032502924000.html
https: 協議
new.qq.com : 主機名(域名) 省略了埠 443
omn/TWF20200/TWF2020032502924000.html 訪問資源的路徑
anchor : 錨點 前端用來做頁面定位或者導航 - User-Aagent :使用者代理 記錄了使用者的作業系統、瀏覽器等,為了讓使用者更好的獲取Html頁面效果。很多網站都會根據User-Aagent做反爬處理,一般爬蟲都需要新增User-Aagent。
例如:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
win10對應的就是Windows NT 10.0 - Referer :表明當前的這個請求是從哪個url連結過來的。常常被用來統計使用者來源,一般也可以作為一個反爬的方式。比如www.hao123.com
爬蟲網路請求模組urllib
- 使用原因
- 一些老的爬蟲專案用的是urllib
- 有時爬取資料需要 urllib + requests
- python內建庫
- urllib在某些方面比較強大
用urllib下載圖片:
from urllib import request
url = 'https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3942751454,1089199356&fm=26&gp=0.jpg'
request.urlretrieve(url, 'code2.png')
爬取百度首頁的時候,如果不加上User-Agent,不能拿到真正的首頁資訊
import urllib.request
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/87.0.4280.88 Safari/537.36 '
}
# 1.建立請求的物件(構建user-agent)
req = urllib.request.Request(url, headers=headers)
# 2.獲取響應物件(urlopen)
res = urllib.request.urlopen(req)
# 3.讀取響應物件的內容read().decode('utf-8')
html = res.read().decode('utf-8')
print(html)
print(res.getcode()) # 獲取狀態碼
print(res.geturl()) # url
url中的漢字轉化為16進位制
import urllib.parse
import urllib.request
base_url = 'https://www.baidu.com/s?'
key = input('請輸入您要搜尋的內容:')
wd = {'wd':key}
# urlencode() 傳遞一個字典,進行中文處理
key = urllib.parse.urlencode(wd)
url = base_url + key
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
req = urllib.request.Request(url,headers=headers)
res = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
# 儲存檔案
with open('搜尋.html','w',encoding='utf-8') as f:
f.write(html)