學習了之前的基礎和爬蟲基礎之后,我們要開始學習網路請求了,
文章目錄
- urllib的介紹
- urllib庫的四大模塊:
- 案例
- 發送請求
- 代碼案例
- 發送請求-Request請求
- IP代理
- 使用cookie
- 例外處理
先來看看urllib
urllib的介紹
urllib是Python自帶的標準庫中用于網路請求的庫,無需安裝,直接參考即可,
主要用來做爬蟲開發,API資料獲取和測驗中使用,
urllib庫的四大模塊:
- urllib.request: 用于打開和讀取url
- urllib.error : 包含提出的例外,urllib.request
- urllib.parse:用于決議url
- urllib.robotparser:用于決議robots.txt
案例
# 作者:互聯網老辛
# 開發時間:2021/4/5/0005 8:23
import urllib.parse
kw={'wd':"互聯網老辛"}
result=urllib.parse.urlencode(kw)
print(result)
#解碼
res=urllib.parse.unquote(result)
print(res)

瀏覽器中會把互聯網老辛,改成非中文的形式
我在瀏覽器中搜互聯網老辛,然后把瀏覽中的復制下來:

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E4%BA%92%E8%81%94%E7%BD%91%E8%80%81%E8%BE%9B&fenlei=256&oq=%25E7%25BE%258E%25E5%259B%25A2&rsv_pq=aa5b8079001eec3e&rsv_t=9ed1VMqcHzdaH7l2O1E8kMBcAS8OfSAGWHaXNgUYsfoVtGNbNVzHRatL1TU&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_btype=t&inputT=3542&rsv_sug2=0&rsv_sug4=3542
仔細看下,加粗的部分是不是就是我們在代碼中輸出的wd的結果
發送請求
- urllib.request 庫
模擬瀏覽器發起一個http請求,并獲取請求的回應結果 - urllib.request.urlopen 的語法格式:
urlopen(url,data=None,[timeout]*,cafile=None,capath=None,cadefault=False,context=None
引數說明:
url: str型別的地址,也就是要訪問的URL,例如https://www/baidu.com
data: 默認值為None
urlopen函式回傳的是一個http.client.HTTPResponse物件
代碼案例
get請求
# 作者:互聯網老辛
# 開發時間:2021/4/5/0005 8:23
import urllib.request
url="http://www.geekyunwei.com/"
resp=urllib.request.urlopen(url)
html=resp.read().decode('utf-8') #將bytes轉成utf-8型別
print(html)
為什么要改成utf-8而不是gbk, 這里要看網頁的檢查網頁源代碼里是什么:

發送請求-Request請求
我們去爬取豆瓣
# 作者:互聯網老辛
# 開發時間:2021/4/5/0005 8:23
import urllib.request
url="https://movie.douban.com/"
resp=urllib.request.urlopen(url)
print(resp)
豆瓣有反爬蟲策略,會直接報418錯誤

對于這種我們需要偽裝請求頭:
我們找到網頁中的user-Agent:
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400
# 作者:互聯網老辛
# 開發時間:2021/4/5/0005 8:23
import urllib.request
url="https://movie.douban.com/"
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400'}
#構建請求物件
req=urllib.request.Request(url,headers=headers)
#使用urlopen打開請求
resp=urllib.request.urlopen(req)
#從回應結果中讀取資料
html=resp.read().decode('utf-8')
print(html)
這樣我們就用Python成功的偽裝成瀏覽器獲取到了資料
IP代理
opener的使用,構建自己的opener發送請求
# 作者:互聯網老辛
# 開發時間:2021/4/5/0005 8:23
import urllib.request
url="https://www.baidu.com/"
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400'}
#構建請求物件
req=urllib.request.Request(url,headers=headers)
opener=urllib.request.build_opener()
resp=opener.open(req)
print(resp.read().decode())
如果你不停的發送請求,他有可能給你禁止IP, 所以我們每隔一段時間就換一個IP代理,
IP代理分類:
- 透明代理: 目標網站知道你使用了代理并且知道你的源IP地址,這種代理肯定不符合我們的初衷
- 匿名代理: 網站知道你使用了代理,但不知道你的源ip
- 高匿代理: 這是最保險的方式,目錄網站不知道你使用了代理
ip代理的方式:
免費的: https://www.xicidaili.com/nn/
收費的: 大象代理,快代理,芝麻代理
# 作者:互聯網老辛
# 開發時間:2021/4/5/0005 8:23
from urllib.request import build_opener
from urllib.request import ProxyHandler
proxy=ProxyHandler({'https':'222.184.90.241:4278'})
opener=build_opener(proxy)
url='https://www.baidu.com/'
resp=opener.open(url)
print(resp.read().decode('utf-8'))
百度其實能夠做到反爬,即使是高匿代理也做不到百分百的繞過,
使用cookie
為什么使用cookie?
使用cookie主要是為了解決http的無狀態性,
使用步驟:
- 實體化MozillaCookiejar(保存cookie)
- 創建handler物件(cookie的處理器)
- 創建opener物件
- 打開網頁(發送請求獲取回應)
- 保存cookie檔案
案例: 獲取百度貼的cookie存盤下來
import urllib.request
from http import cookiejar
filename='cookie.txt'
def get_cookie():
cookie=cookiejar.MozillaCookieJar(filename)
#創建handler物件
handler=urllib.request.HTTPCookieProcessor(cookie)
opener=urllib.request.build_opener((handler))
#請求網址
url='https://tieba.baidu.com/f?kw=python3&fr=index'
resp=opener.open(url)
# 保存cookie
cookie.save()
#讀取資料
def use_cookie():
#實體化MozillaCookieJar
cookie=cookiejar.MozillaCookieJar()
#加載cookie檔案
cookie.load(filename)
print(cookie)
if __name__=='__main--':
use_cookie()
#get_cookie()
例外處理
我們爬取一個訪問不了的網站來捕獲例外
# 作者:互聯網老辛
# 開發時間:2021/4/6/0006 7:38
import urllib.request
import urllib.error
url='https://www.google.com'
try:
resp=urllib.request.urlopen(url)
except urllib.error.URLError as e:
print(e.reason)
可以看到捕獲到了例外

網路請求我們已經學完了,后面我們將學習幾個常用的庫,之后就可以進行資料的爬取了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/273248.html
標籤:python
