1. 程式人生 > 其它 >爬蟲網路請求模組urllib

爬蟲網路請求模組urllib

目錄


基本概念

  • 客戶端向伺服器發起請求的兩種方式
    • 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
    User-Agent通常格式:Mozilla/5.0 (平臺) 引擎版本 瀏覽器版本號
    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)