日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python urllib

Python urllib

Python urllib 庫用于操作網(wǎng)頁 URL,并對網(wǎng)頁的內(nèi)容進(jìn)行抓取處理。

本文主要介紹 Python3 的 urllib。

urllib 包 包含以下幾個模塊:

  • urllib.request - 打開和讀取 URL。
  • urllib.error - 包含 urllib.request 拋出的異常。
  • urllib.parse - 解析 URL。
  • urllib.robotparser - 解析 robots.txt 文件。

urllib.request

urllib.request 定義了一些打開 URL 的函數(shù)和類,包含授權(quán)驗(yàn)證、重定向、瀏覽器 cookies等。

urllib.request 可以模擬瀏覽器的一個請求發(fā)起過程。

我們可以使用 urllib.request 的 urlopen 方法來打開一個 URL,語法格式如下:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
  • url:url 地址。
  • data:發(fā)送到服務(wù)器的其他數(shù)據(jù)對象,默認(rèn)為 None。
  • timeout:設(shè)置訪問超時時間。
  • cafile 和 capath:cafile 為 CA 證書, capath 為 CA 證書的路徑,使用 HTTPS 需要用到。
  • cadefault:已經(jīng)被棄用。
  • context:ssl.SSLContext類型,用來指定 SSL 設(shè)置。

實(shí)例如下:

實(shí)例

from
urllib.
request
import urlopen

myURL
= urlopen
(
"https://www.runoob.com/"
)


print
(myURL.
read
(
)
)

以上代碼使用 urlopen 打開一個 URL,然后使用 read() 函數(shù)獲取網(wǎng)頁的 HTML 實(shí)體代碼。

read() 是讀取整個網(wǎng)頁內(nèi)容,我們可以指定讀取的長度:

實(shí)例

from
urllib.
request
import urlopen

myURL
= urlopen
(
"https://www.runoob.com/"
)


print
(myURL.
read
(
300
)
)

除了 read() 函數(shù)外,還包含以下兩個讀取網(wǎng)頁內(nèi)容的函數(shù):

  • readline() - 讀取文件的一行內(nèi)容

    from urllib.request import urlopen
    
    myURL = urlopen("https://www.runoob.com/")
    print(myURL.readline()) #讀取一行內(nèi)容
  • readlines() - 讀取文件的全部內(nèi)容,它會把讀取的內(nèi)容賦值給一個列表變量。

    from urllib.request import urlopen
    
    myURL = urlopen("https://www.runoob.com/")
    lines = myURL.readlines()
    for line in lines:
        print(line)

我們在對網(wǎng)頁進(jìn)行抓取時,經(jīng)常需要判斷網(wǎng)頁是否可以正常訪問,這里我們就可以使用 getcode() 函數(shù)獲取網(wǎng)頁狀態(tài)碼,返回 200 說明網(wǎng)頁正常,返回 404 說明網(wǎng)頁不存在:

實(shí)例

import
urllib.
request

myURL1
=
urllib.
request.
urlopen
(
"https://www.runoob.com/"
)


print
(myURL1.
getcode
(
)
)  
# 200

try:

    myURL2
=
urllib.
request.
urlopen
(
"https://www.runoob.com/no.html"
)


except
urllib.
error.
HTTPError
as e:

   
if e.
code
==
404:

       
print
(
404
)  
# 404

更多網(wǎng)頁狀態(tài)碼可以查閱:。

如果要將抓取的網(wǎng)頁保存到本地,可以使用 函數(shù):

實(shí)例

from
urllib.
request
import urlopen

myURL
= urlopen
(
"https://www.runoob.com/"
)

f
=
open
(
"runoob_urllib_test.html"
,
"wb"
)

content
= myURL.
read
(
)  
# 讀取網(wǎng)頁內(nèi)容

f.
write
(content
)

f.
close
(
)

執(zhí)行以上代碼,在本地就會生成一個 runoob_urllib_test.html 文件,里面包含了 https://www.runoob.com/ 網(wǎng)頁的內(nèi)容。

更多Python File 處理,可以參閱:

。

URL 的編碼與解碼可以使用 urllib.request.quote()urllib.request.unquote() 方法:

實(shí)例

import
urllib.
request

encode_url
=
urllib.
request.
quote
(
"https://www.runoob.com/"
)  
# 編碼


print
(encode_url
)

unencode_url
=
urllib.
request.
unquote
(encode_url
)    
# 解碼


print
(unencode_url
)

輸出結(jié)果為:

https%3A//www.runoob.com/
https://www.runoob.com/

模擬頭部信息

我們抓取網(wǎng)頁一般需要對 headers(網(wǎng)頁頭信息)進(jìn)行模擬,這時候需要使用到 urllib.request.Request 類:

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
  • url:url 地址。
  • data:發(fā)送到服務(wù)器的其他數(shù)據(jù)對象,默認(rèn)為 None。
  • headers:HTTP 請求的頭部信息,字典格式。
  • origin_req_host:請求的主機(jī)地址,IP 或域名。
  • unverifiable:很少用整個參數(shù),用于設(shè)置網(wǎng)頁是否需要驗(yàn)證,默認(rèn)是False。。
  • method:請求方法, 如 GET、POST、DELETE、PUT等。

實(shí)例 - py3_urllib_test.py 文件代碼

import
urllib.
request


import
urllib.
parse

url
=
'https://www.runoob.com/?s='  
# 菜鳥教程搜索頁面


keyword
=
'Python 教程'

key_code
=
urllib.
request.
quote
(
keyword
)  
# 對請求進(jìn)行編碼

url_all
= url+key_code

header
=
{

   
'User-Agent':
'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'


}  
#頭部信息

request
=
urllib.
request.
Request
(url_all
,headers
=header
)

reponse
=
urllib.
request.
urlopen
(request
).
read
(
)

fh
=
open
(
"./urllib_test_runoob_search.html"
,
"wb"
)    
# 將文件寫入到當(dāng)前目錄中

fh.
write
(reponse
)

fh.
close
(
)

執(zhí)行以上 Python 代碼,會在當(dāng)前目錄生成 urllib_test_runoob_search.html 文件,打開 urllib_test_runoob_search.html 文件(可以使用瀏覽器打開),內(nèi)容如下:

表單 POST 傳遞數(shù)據(jù),我們先創(chuàng)建一個表單,代碼如下,我這里使用了 PHP 代碼來獲取表單的數(shù)據(jù):

實(shí)例 - py3_urllib_test.php 文件代碼:













菜鳥教程(runoob.com) urllib POST  測試<br />










    Name:



    Tag:



   












// 使用 PHP 來獲取表單提交的數(shù)據(jù),你可以換成其他的


if(isset($_POST['name']) && $_POST['tag'] ) {


   echo $_POST["name"] . ', ' . $_POST['tag'];


}


?>






實(shí)例

import
urllib.
request


import
urllib.
parse

url
=
'https://www.runoob.com/try/py3/py3_urllib_test.php'  
# 提交到表單頁面

data
=
{
'name':
'RUNOOB'
,
'tag' :
'菜鳥教程'
}  
# 提交數(shù)據(jù)

header
=
{

   
'User-Agent':
'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'


}  
#頭部信息

data
=
urllib.
parse.
urlencode
(data
).
encode
(
'utf8'
)  
# 對參數(shù)進(jìn)行編碼,解碼使用 urllib.parse.urldecode

request
=
urllib.
request.
Request
(url
, data
, header
)  
# 請求處理

reponse
=
urllib.
request.
urlopen
(request
).
read
(
)      
# 讀取結(jié)果

fh
=
open
(
"./urllib_test_post_runoob.html"
,
"wb"
)    
# 將文件寫入到當(dāng)前目錄中

fh.
write
(reponse
)

fh.
close
(
)

執(zhí)行以上代碼,會提交表單數(shù)據(jù)到 py3_urllib_test.php 文件,輸出結(jié)果寫入到 urllib_test_post_runoob.html 文件。

打開 urllib_test_post_runoob.html 文件(可以使用瀏覽器打開),顯示結(jié)果如下:


urllib.error

urllib.error 模塊為 urllib.request 所引發(fā)的異常定義了異常類,基礎(chǔ)異常類是 URLError。

urllib.error 包含了兩個方法,URLError 和 HTTPError。

URLError 是 OSError 的一個子類,用于處理程序在遇到問題時會引發(fā)此異常(或其派生的異常),包含的屬性 reason 為引發(fā)異常的原因。

HTTPError 是 URLError 的一個子類,用于處理特殊 HTTP 錯誤例如作為認(rèn)證請求的時候,包含的屬性 code 為 HTTP 的狀態(tài)碼, reason 為引發(fā)異常的原因,headers 為導(dǎo)致 HTTPError 的特定 HTTP 請求的 HTTP 響應(yīng)頭。

對不存在的網(wǎng)頁抓取并處理異常:

實(shí)例

import
urllib.
request


import
urllib.
error

myURL1
=
urllib.
request.
urlopen
(
"https://www.runoob.com/"
)


print
(myURL1.
getcode
(
)
)  
# 200

try:

    myURL2
=
urllib.
request.
urlopen
(
"https://www.runoob.com/no.html"
)


except
urllib.
error.
HTTPError
as e:

   
if e.
code
==
404:

       
print
(
404
)  
# 404


urllib.parse

urllib.parse 用于解析 URL,格式如下:

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

urlstring 為 字符串的 url 地址,scheme 為協(xié)議類型,

allow_fragments 參數(shù)為 false,則無法識別片段標(biāo)識符。相反,它們被解析為路徑,參數(shù)或查詢組件的一部分,并 fragment 在返回值中設(shè)置為空字符串。

實(shí)例

from
urllib.
parse
import
urlparse

o
=
urlparse
(
"https://www.runoob.com/?s=python+%E6%95%99%E7%A8%8B"
)


print
(o
)

以上實(shí)例輸出結(jié)果為:

ParseResult(scheme='https', netloc='www.runoob.com', path='/', params='', query='s=python+%E6%95%99%E7%A8%8B', fragment='')

從結(jié)果可以看出,內(nèi)容是一個元組,包含 6 個字符串:協(xié)議,位置,路徑,參數(shù),查詢,判斷。

我們可以直接讀取協(xié)議內(nèi)容:

實(shí)例

from
urllib.
parse
import
urlparse

o
=
urlparse
(
"https://www.runoob.com/?s=python+%E6%95%99%E7%A8%8B"
)


print
(o.
scheme
)

以上實(shí)例輸出結(jié)果為:

https

完整內(nèi)容如下:

scheme

0

URL協(xié)議

scheme 參數(shù)

netloc

1

網(wǎng)絡(luò)位置部分

空字符串

path

2

分層路徑

空字符串

params

3

最后路徑元素的參數(shù)

空字符串

query

4

查詢組件

空字符串

fragment

5

片段識別

空字符串

username

用戶名

None

password

密碼

None

hostname

主機(jī)名(小寫)

None

port

端口號為整數(shù)(如果存在)

None

屬性

索引

值(如果不存在)


urllib.robotparser

urllib.robotparser 用于解析 robots.txt 文件。

robots.txt(統(tǒng)一小寫)是一種存放于網(wǎng)站根目錄下的 robots 協(xié)議,它通常用于告訴搜索引擎對網(wǎng)站的抓取規(guī)則。

urllib.robotparser 提供了 RobotFileParser 類,語法如下:

class urllib.robotparser.RobotFileParser(url='')

這個類提供了一些可以讀取、解析 robots.txt 文件的方法:

  • set_url(url) - 設(shè)置 robots.txt 文件的 URL。

  • read() - 讀取 robots.txt URL 并將其輸入解析器。

  • parse(lines) - 解析行參數(shù)。

  • can_fetch(useragent, url) - 如果允許 useragent 按照被解析 robots.txt 文件中的規(guī)則來獲取 url 則返回 True。

  • mtime() -返回最近一次獲取 robots.txt 文件的時間。 這適用于需要定期檢查 robots.txt 文件更新情況的長時間運(yùn)行的網(wǎng)頁爬蟲。

  • modified() - 將最近一次獲取 robots.txt 文件的時間設(shè)置為當(dāng)前時間。

  • crawl_delay(useragent) -為指定的 useragent 從 robots.txt 返回 Crawl-delay 形參。 如果此形參不存在或不適用于指定的 useragent 或者此形參的 robots.txt 條目存在語法錯誤,則返回 None。

  • request_rate(useragent) -以 named tuple RequestRate(requests, seconds) 的形式從 robots.txt 返回 Request-rate 形參的內(nèi)容。 如果此形參不存在或不適用于指定的 useragent 或者此形參的 robots.txt 條目存在語法錯誤,則返回 None。

  • site_maps() - 以 list() 的形式從 robots.txt 返回 Sitemap 形參的內(nèi)容。 如果此形參不存在或者此形參的 robots.txt 條目存在語法錯誤,則返回 None。

實(shí)例

>>>
import
urllib.
robotparser


>>> rp
=
urllib.
robotparser.
RobotFileParser
(
)


>>> rp.
set_url
(
"http://www.musi-cal.com/robots.txt"
)


>>> rp.
read
(
)


>>> rrate
= rp.
request_rate
(
"*"
)


>>> rrate.
requests


3


>>> rrate.
seconds


20


>>> rp.
crawl_delay
(
"*"
)


6


>>> rp.
can_fetch
(
"*"
,
"http://www.musi-cal.com/cgi-bin/search?city=San+Francisco"
)


False


>>> rp.
can_fetch
(
"*"
,
"http://www.musi-cal.com/"
)


True


文章名稱:Python urllib
文章URL:http://m.5511xx.com/article/dhgeoip.html