urlopen()
原型:urlopen(url, data=none, proxies=none)
作用:建立乙個表示遠端url的類檔案物件,然後像本地檔案一樣操作這個類檔案物件來獲取遠端資料。
url:統一資源定位符,表示遠端資料的路徑,一般是**;
data:表示資料提交到url的方式
proxies:用於設定**
from urllib import request
from urllib import parse
res = request.urlopen(
'')print
(res)
# 返回類檔案物件http.client.httpresponse
print
(res.read(
).decode(
'utf-8'))
print
(res.readline())
# 返回bytes
print
(res.readlines())
# 返回list
print
(res.getcode())
# 返回int狀態碼
print
(res.geturl())
# 返回請求的url
)# 爬取原始碼並儲存
)# 爬取並儲存
urlencode()
作用:可以把key-value這樣的鍵值對轉換成我們想要的格式,返回的是a=1&b=2這樣的字串。其中除中文,數字,部分字元外,其他的字元用%和十六進製制編碼
params =
result = parse.urlencode(params)
print
("編碼結果:\n"
,result)
parse_qs()
作用:將a=1&b=2這樣的請求引數轉成字典格式
params =
qs = parse.urlencode(params)
print
("將字典轉換為請求引數格式:\n"
, qs)
res = parse.parse_qs(qs)
print
("將請求引數轉換成字典格式:\n"
, res)
unquote()
作用:將url請求引數形式(%和十六進製制編碼)的字串解碼
url =
''print
('解碼結果:'
,parse.unquote(url)
)
urlparse() 和 urlsplit()
作用:對url按照一定格式進行拆分或拼接,獲取指定引數
url基本結構:
以下面這個url為例,介紹下普通url的各部分組成參考部落格:從上面的url可以看出,乙個完整的url包括以下幾部分:
1、協議部分:該url的協議部分為「http:」,這代表網頁使用的是http協議。在internet中可以使用多種協議,如http,ftp等等本例中使用的是http協議。在"http"後面的「//」為分隔符
3、埠部分:跟在網域名稱後面的是埠,網域名稱和埠之間使用「:」作為分隔符。埠不是乙個url必須的部分,如果省略埠部分,將採用預設埠80
4、虛擬目錄部分:從網域名稱後的第乙個「/」開始到最後乙個「/」為止,是虛擬目錄部分。虛擬目錄也不是乙個url必須的部分。本例中的虛擬目錄是「/news/」
5、檔名部分:從網域名稱後的最後乙個「/」開始到「?」為止,是檔名部分,如果沒有「?」,則是從網域名稱後的最後乙個「/」開始到「#」為止,是檔案部分,如果沒有「?」和「#」,那麼從網域名稱後的最後乙個「/」開始到結束,都是檔名部分。本例中的檔名是「index.asp」。檔名部分也不是乙個url必須的部分,如果省略該部分,則使用預設的檔名
6、錨部分:從「#」開始到最後,都是錨部分。本例中的錨部分是「name」。錨部分也不是乙個url必須的部分
7、引數部分:從「?」開始到「#」為止之間的部分為引數部分,又稱搜尋部分、查詢部分。本例中的引數部分為「boardid=5&id=24618&page=1」。引數可以允許有多個引數,引數與引數之間用「&」作為分隔符。
urlsplit是拆分,而urlparse是解析,所以urlparse粒度更為細緻
url =
''res1 = parse.urlparse(url)
# 多乙個params屬性,一般用的比較少
res2 = parse.urlsplit(url)
print
(res1)
# urllib.parse.parseresult
print
(res2)
執行結果:
注:可以看到urlparse()的結果中多了乙個params屬性,urlsplit()在分割的時候,path和params屬性是在一起的,其他屬性完全一樣
下面用到request物件對伺服器發起請求,這裡可能有人要問了,那urlopen()可以發起請求,為什麼還要建立request物件再發起請求呢?
如果我們在獲取請求物件時,不需要過多的引數傳遞,可以直接用urlopen()
如果需要進一步的包裝請求,則需要用request物件對請求資料進行包裝處理
# 請求**
url =
''# 請求頭資訊中加入user-agent和referer讓我們偽裝的更像瀏覽器請求
headers =
# 賬戶資訊
data =
# request物件中的data必須為bytes格式
req = request.request(url, headers=headers, data=parse.urlencode(data)
.encode(
'utf-8'
), method=
'post'
)res = request.urlopen(req)
content = res.read(
)with
open
('1.html'
,'wb'
)as f:
f.write(content)
爬取結果:
簡單的爬蟲
參考xlzd的知乎專欄 encoding utf 8 from bs4 import beautifulsoup import requests import codecs download url requests模擬http協議中的get請求,用於獲取目標 的原始碼 def download p...
簡單的爬蟲
這幾天來一直在做爬蟲的工作,除了因為開始因為不熟悉爬蟲所以學的時候比較花時間之外,其他大多數時候都還是比較順利,中間除了遇到xpath的問題,其他就還好。就我目前的理解而言爬蟲總共是分為三個步驟。1.通過url獲取網頁 2.獲取網頁之後對網頁進行解析 3.將解析之後需要的內容存貯起來 獲取網頁 這一...
簡單的爬蟲
好久沒有上傳新的部落格了,上上週寫出了爬蟲,但是因為偷懶和末考,一直到今天才回來寫有關這個爬蟲的部落格。原來不了解爬蟲的時候感覺爬蟲好高大上啊,做了之後才發現.哦,好簡單.還有,在這裡要感謝一下虎撲大大,感謝他沒有封我的ip.其實爬蟲很簡單,用到了httpclient還有htmlparser.對ht...