socket,urllib,urllib3,request多種方法請求網頁首頁



請求網頁是爬蟲的基礎,多種請求網頁方法如下:
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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM