爬蟲簡單函式的用法

2021-10-02 12:43:05 字數 3562 閱讀 7876

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...