請求網頁是爬蟲的基礎,多種請求網頁方法如下:
socket訪問
# 用socket發出請求 import socket # 創建一個套接字客戶端 client = socket.socket() # 連接百度 client.connect(("www.baidu.com",80)) # 構造報文 req = 'GET / HTTP/1.0\r\nHost:www.baidu.com\r\n\r\n' # 發送請求 client.send(req.encode()) # 循環接受消息 data = client.recv(1024) res = b"" while data: res += data data = client.recv(1024)
如果socket套接字中添加請求頭的,直接在請求報文中添加
req = 'GET / HTTP/1.0\r\nHost:www.baidu.com\r\nUser-Agent:{}\r\n\r\n'.format(ua)
urllib方法:
import urllib.request # 通過urlopen方法向百度發送網絡請求 req = urllib.request.urlopen("http://www.baidu.com") # 通過read()方法接受百度響應 res = req.read().decode() print(res)
當服務器返回響應的狀態碼403,比如訪問https://www.jianshu.com,這個時候我們需要添加請求頭部,偽裝成瀏覽器訪問,我們可以發現urlopen方法中的參數有url,data和timeout,並沒有可以添加請求頭的參數,那么就需要用到urllib.request中的另一個類對象Request
import urllib.request headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' } # 用Request方法添加請求頭部 req = urllib.request.Request("https://www.jianshu.com",headers=headers) # 通過urlopen發送請求並讀取響應 res = urllib.request.urlopen(req).read().decode() print(res)
通過urllib庫,也可以構造cookie處理器,創建一個opener對象進行訪問,注urlopen是一個特殊的opener對象
import urllib.request from http import cookiejar headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' } # 創建cookies對象 cookies = cookiejar.CookieJar() # 創建一個cookie處理器 cookie = urllib.request.HTTPCookieProcessor(cookies) # 創建一個opener對象 opener = urllib.request.build_opener(cookie) # 用創建的opener對象對簡書發出請求 req = urllib.request.Request("https://www.jianshu.com",headers=headers) res = opener.open(req).read().decode() print(res)
urllib3方法訪問:
urllib3中的參數中能夠直接傳參headers,請求比前幾種方法更為方便
import urllib3 # 實例一個PoolManager對象構造請求 http = urllib3.PoolManager() # request方法發送請求 req = http.request("GET","https://www.jianshu.com",headers=headers) # data讀取響應數據 res = req.data.decode() print(res)
requests方法訪問:
import requests # 發送請求 req = requests.get("https://www.jianshu.com",headers=headers) # 讀取響應 # 方法1:text讀取 req.encoding = "utf-8" print(req.text) # 方法2:content讀取 print(req.content)