欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python爬蟲請求頁面urllib庫詳解

 更新時間:2023年07月07日 10:08:25   作者:milk-request  
這篇文章主要介紹了python爬蟲請求頁面urllib庫詳解,python3將urllib和urllib2模塊整合并命名為urllib模塊,urllib模塊有多個子模塊,各有不同的功能,需要的朋友可以參考下

基本庫urllib

學習爬蟲,最初的操作便是模擬瀏覽器向服務端發(fā)出請求,這里我們就學習使用urlib庫的用法

使用urllib

首先,我們需要了解urllib庫,它是python內(nèi)置的HTTP請求庫,也就是說不需要額外安裝即可使用,它包含4個模塊

  • request:它是最基本的HTTP請求模塊,可以用來模擬發(fā)送請求。
  • error:異常處理模塊。
  • parse:一個工具模塊,提供了許多URL處理方法。
  • robotparser:主要時用來識別網(wǎng)站的robot.txt文件然后判斷那些網(wǎng)站是否可以爬。

發(fā)送請求

urllib.request模塊提供了最基本的構造HTTP請求的方法,urllib.request.urlopen(),若在獲取請求對象時,不需要過多的參數(shù)傳遞,可以直接選擇urllib.request.urlopen();

如果需要加入Headers等信息請求則使用urllib.request.Request()。

1.urlopen()

這里我們以www.baidu.com為例,把這個網(wǎng)頁抓取下來. 代碼如下:

import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))

添加data(附加數(shù)據(jù))參數(shù)

data參數(shù)是可選的。如果要添加該參數(shù),需要使用bytes()方法將參數(shù)轉(zhuǎn)化為bytes類型。

另外,如果傳遞了這個參數(shù),則它的請求方式就不再是GET方式,而是POST方式。

實例:

import urllib.request
import urllib.parse
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf-8')
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read())

我們傳遞的參數(shù)出現(xiàn)在了form字段中,這表明是模擬了以表單提交的方式,以POST方式傳輸數(shù)據(jù),這里的 //httpbin.org是一個提供HTTP請求測試的站點。

添加timeout(超時時間)參數(shù)

timeout參數(shù)用于設置超時時間,單位為s,如果請求超出了設置的這個時間還未響應,就會拋出異常。 實例:

import urllib.request
response = urllib.request.urlopen('http://httpbin.org/post', timeout=1)
print(response.read())

在爬取頁面的過程中,若一個頁面長時間無法響應將導致后續(xù)工作無法進行,所以設置timeout超時時間很有必要。

urllib.request官方文檔

2.Request()

實例:

import urllib.request
request = urllib.request.Request('https://www.baidu.com')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

Request的構造方法如下:

class urllib.request.Request(url,date=None,headers={},origin_req_host=None,unverifiable=False,method=None)

Request參數(shù)

  • url 第一個參數(shù),必傳參數(shù),其他都是可選參數(shù)。
  • data 第二個參數(shù),如果要傳,必須傳bytes類型,如果是字典可先用urllib.parse模快里的urlencode()編碼。
  • headers 第三個參數(shù),可以在構造請求時通過header參數(shù)直接構造,也可通過調(diào)用請求實例的add_header()方法添加。
  • origin_req_host 第四個參數(shù)指的是請求方的host名稱或IP地址。
  • unverifiable 第五個參數(shù)表示這個請求時否時無法驗證的默認時False,意思就是說用戶沒有足夠的權限來選擇接收這個請求的結(jié)果。
  • methon 第六個參數(shù)是一個字符串,指示請求使用的方法,比如GET POST和PUT等。

多參數(shù)實例:

import urllib.request
import urllib.parse
url = 'http://httpbin.org/post'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
                  'Host':'httpbin.org'
}
dict = {
    'name': 'zhangsan'
}
data = bytes(urllib.parse.urlencode(dict), encoding='utf-8')
request = urllib.request.Request(url, data=data, headers=headers, method='POST')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

高級用法

1.驗證

出現(xiàn)情景:有些網(wǎng)站在打開時就會彈出提示框,提示你輸入用戶名和密碼,驗證成功后才能查看頁面,如果要請求這樣的頁面,該怎么辦呢?借助HTTPBasicAuthHandler就可以完成。 代碼如下:

from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError
username = '用戶名'
password = '密碼'
url = '你要請求的url'
#構建一個密碼管理對象,用來保存需要處理的用戶名和密碼
passwdmgr = HTTPPasswordMgrWithDefaultRealm()
# 添加賬戶信息,第一個參數(shù)realm是與遠程服務器相關的域信息,一般沒人管它都是寫None,后面三個參數(shù)分別是 代理服務器、用戶名、密碼
passwdmgr.add_password(None, url , username, password)
auth_handler = HTTPBasicAuthHandler(passwdmgr)
opener = build_opener(auth_handler)
try:
   result = opener.open(url)
   html = result.read().decode('utf-8)
   print(html)
except URLError as e:
   print(e.reason)

2.代理

添加代理

from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener
proxy_handler = ProxyHandler({
    'http': 'http://127.0.0.1:9743',
    'https': 'http://127.0.0.1:9743'
})
opener = build_opener(proxy_handler)
try:
    response = opener.open('https://www.baidu.com')
    print(response.read().decode('utf-8'))
except URLError as e:
    print(e.reason)

3.Cookies

從網(wǎng)站中獲取Cookies

代碼:

import http.cookiejar
import urllib.request
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
    print(item.name + "=" + item.value)

為什么要獲取Cookies?

維持同一個對話。例如:你用post方式登入了某個網(wǎng)站,又使用了get方式來獲取網(wǎng)站個人頁面信息,這相當于打開了兩個瀏覽器,是兩個會話,不能成功獲取個人信息。所以可以在get方式添加cookies參數(shù)來維持對話。

保存Cookies

將CookieJar換成MozillaCookieJar,它在生成文件時會用到,是CookieJar的子類,用來處理Cookie和文件相關的事件。 代碼:

import http.cookiejar
import urllib.request
filename = 'cookies.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)

運行之后,可以發(fā)現(xiàn)項目文件夾中生成了一個cookies.txt文件,另外LWPCookieJar可以保存LWP格式的Cookies文件。

如果想獲取更多高級用法,可查看官方文檔

處理異常

為何要處理異常? 在請求過程中,可能會出現(xiàn)多種多樣的錯誤,如果 爬取多個頁面,其中一個頁面出現(xiàn)錯誤會使程序報錯而終止運行,所以異常處理是十分有必要的。這里我們學習處理HTTP請求錯誤異常。

HTTPError

屬性:
code:返回HTTP狀態(tài)碼
reason:返回錯誤原因
headers:返回請求頭

實例:

import urllib.error
import urllib.request
try:
    response = urllib.request.urlopen('https://www.baidu.com', timeout=0.01)
except urllib.error.HTTPError as e:
    print(e.reason, e.code, e.headers, sep='\n')

這里為了實現(xiàn)異常將超時間設置為0.01,拋出了time out異常。

解析鏈接

為什么要解析鏈接?

當你在爬取網(wǎng)頁時,可能會需要搜索此網(wǎng)頁的其他信息。這時就需要解析鏈接,構造鏈接。

URL由6個部分構成: (://)符號前的是協(xié)議scheme,第一個/符號前是域名netloc,后面是path路徑,分號(;)后面是參數(shù)params,問號(?)后面是查詢條件query,一般用作GET類型的URL,井號(#)后面是錨點,用于直接定位頁面內(nèi)部下拉位置。

標準鏈接格式: scheme://netloc/path;params?query#fragment

urlparse()

該方法可以實現(xiàn)URL的識別和分段

參數(shù)
urlstring:這是必填項。待解析的URL。
scheme:默認協(xié)議。
allow_fragments:是否忽略fragment。如果被設置為False,fragment部分就會被忽略,被解析為path,parameters,query的一部分。

實例:

from urllib.parse import urlparse
result = urlparse('https://docs.python.org/3/library/urllib.request.html#urllib.request.OpenerDirector')
print(type(result), result)

對url進行解析的各種方法官方文檔

到此這篇關于python爬蟲請求頁面urlib庫詳解的文章就介紹到這了,更多相關python爬蟲urlib庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python字符串字母大小寫轉(zhuǎn)換的各種情況詳析

    Python字符串字母大小寫轉(zhuǎn)換的各種情況詳析

    在使用python語言開發(fā)中經(jīng)常會碰到,需要大寫轉(zhuǎn)小寫,小寫轉(zhuǎn)換大寫,甚至字符串中的單詞首字母大寫,以及字符串手字字母大寫的問題,下面這篇文章主要給大家介紹了關于Python字符串字母大小寫轉(zhuǎn)換的相關資料,需要的朋友可以參考下
    2022-05-05
  • Python中WatchDog的使用經(jīng)驗總結(jié)

    Python中WatchDog的使用經(jīng)驗總結(jié)

    在?python?中文件監(jiān)視主要有兩個庫,一個是?pyinotify,一個是?watchdog,本文主要為大家詳細介紹一下Python中WatchDog的使用相關經(jīng)驗,感興趣的小伙伴可以了解下
    2023-12-12
  • python實現(xiàn)時間序列自相關圖(acf)、偏自相關圖(pacf)教程

    python實現(xiàn)時間序列自相關圖(acf)、偏自相關圖(pacf)教程

    這篇文章主要介紹了python實現(xiàn)時間序列自相關圖(acf)、偏自相關圖(pacf)教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 自制Python淘寶秒殺搶購腳本雙十一百分百中

    自制Python淘寶秒殺搶購腳本雙十一百分百中

    年年雙十一,年年搶不到,今年小編自制Python淘寶秒殺搶購腳本,百分百中,下面小編把我的實現(xiàn)思路分享給大家,有興趣的朋友借鑒下吧
    2021-11-11
  • Python?threading和Thread模塊及線程的實現(xiàn)

    Python?threading和Thread模塊及線程的實現(xiàn)

    這篇文章主要介紹了Python?threading和Thread模塊及線程的實現(xiàn),Python通過兩個標準庫thread和threading提供對線程的支持,threading對thread進行了封裝,具體實現(xiàn)介紹需要的朋友可以參考一下下面文章內(nèi)容
    2022-06-06
  • matplotlib繪制直方圖的基本配置(萬能模板案例)

    matplotlib繪制直方圖的基本配置(萬能模板案例)

    本文主要介紹了matplotlib繪制直方圖的基本配置(萬能模板案例),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 時間序列預測中的數(shù)據(jù)滑窗操作實例(python實現(xiàn))

    時間序列預測中的數(shù)據(jù)滑窗操作實例(python實現(xiàn))

    滑動窗口操作非常普遍,非常有用,它們也很容易在Python中實現(xiàn),下面這篇文章主要給大家介紹了關于時間序列預測中的數(shù)據(jù)滑窗操作python實現(xiàn)的相關資料,需要的朋友可以參考下
    2022-03-03
  • Python數(shù)據(jù)庫的連接實現(xiàn)方法與注意事項

    Python數(shù)據(jù)庫的連接實現(xiàn)方法與注意事項

    這篇文章主要介紹了Python數(shù)據(jù)庫的連接實現(xiàn)方法與注意事項,需要的朋友可以參考下
    2016-02-02
  • numpy中tensordot的用法

    numpy中tensordot的用法

    本文主要介紹了numpy中tensordot的用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • python字典根據(jù)key排序的實現(xiàn)

    python字典根據(jù)key排序的實現(xiàn)

    本文主要介紹了python字典根據(jù)key排序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01

最新評論