python爬蟲基礎之urllib的使用

2021-03-02 python教程

這篇文章主要介紹了python爬蟲基礎之urllib的使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

一、urllib 和 urllib2的關係

在python2中,主要使用urllib和urllib2,而python3對urllib和urllib2進行了重構,拆分成了urllib.request, urllib.parse, urllib.error,urllib.robotparser等幾個子模塊,這樣的架構從邏輯和結構上說更加合理。urllib庫無需安裝,python3自帶。python 3.x中將urllib庫和urilib2庫合併成了urllib庫。

    urllib2.urlopen() 變成了 urllib.request.urlopen()
    urllib2.Request() 變成了 urllib.request.Request()
    python2中的 cookielib 改為 http.cookiejar.
    import http.cookiejar 代替  import cookielib
    urljoin 現在對應的函數是 urllib.parse.urljoin

二、python3下的urllib庫

request,它是最基本的 HTTP 請求模塊,我們可以用它來模擬發送一請求,只需要給庫方法傳入 URL 還有額外的參數,就可以模擬實現這個過程了。

error ,即異常處理模塊,如果出現請求錯誤,我們可以捕獲這些異常,然後進行重試或其他操作保證程序不會意外終止。

parse ,是一個工具模塊,提供了許多 URL 處理方法,比如拆分、解析、合併等等的方法。

robotparser,主要是用來識別網站的 robots.txt 文件,然後判斷哪些網站可以爬,哪些網站不可以爬的,其實用的比較少。

三、request的基礎類
(一)request.urlopen

urlopen方法最主要的參數就是目標網站的url地址,可以使str類型,也可以是一個request對象。

get方法請求如下:

from urllib import request,parse

respones = request.urlopen(http://www.baidu.com/)

post方法請求,需要添加data參數(字典格式),它要是字節流編碼格式的內容,即 bytes 類型,通過 bytes() 方法可以進行轉化,另外如果傳遞了這個 data 參數,不添加data參數就默認為 GET 方式請求。

from urllib import request,parse

url = "http://www.baidu.com/"

wd = {'wd':'哇哈哈哈'}

data = bytes(parse.urlencode(wd),'utf-8')

respones = request.urlopen(url,data=data)

(二)request.Request

由於單獨使用urlopen() 方法的不能添加User-Agent、Cookie等headers信息,需要構建一個 Request 類型的對象,通過構造這個這個數據結構,一方面我們可以將請求獨立成一個對象,另一方面可配置參數更加豐富和靈活。主要參數有:

url 參數是請求 URL,這個是必傳參數,其他的都是可選參數。

data 參數如果要傳必須傳 bytes(字節流)類型的,如果是一個字典,可以先用 urllib.parse 模塊裡的 urlencode() 編碼。

headers 參數是一個字典,這個就是 Request Headers 了,你可以在構造 Request 時通過 headers 參數直接構造,也可以通過調用 Request 實例的 add_header() 方法來添加, Request Headers 最常用的用法就是通過修改 User-Agent 來偽裝瀏覽器,默認的 User-Agent 是 Python-urllib,我們可以通過修改它來偽裝瀏覽器。

origin_req_host 參數指的是請求方的 host 名稱或者 IP 地址。

unverifiable 參數指的是這個請求是否是無法驗證的,默認是False。意思就是說用戶沒有足夠權限來選擇接收這個請求的結果。例如我們請求一個 HTML 文檔中的圖片,但是我們沒有自動抓取圖像的權限,這時 unverifiable 的值就是 True。

method 參數是一個字符串,它用來指示請求使用的方法,比如GET,POST,PUT等等。

通過隨機的方法,選擇user-agent:

import randomUA_LIST = [

'Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML, like Gecko)',

'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729)',

'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729)',

'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)',

'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; Acoo Browser; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; Avant Browser)',

'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)',

'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)',

'Mozilla/4.0 (compatible; Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729); Windows NT 5.1; Trident/4.0)',

'Mozilla/4.0 (compatible; Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; Acoo Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727); Windows NT 5.1; Trident/4.0; Maxthon; .NET CLR 2.0.50727; .NET CLR 1.1.4322; InfoPath.2)',

'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)'

]

 

#隨機獲取一個user-agent

user_agent = random.choice(UA_LIST)

添加headers頭部信息的方法1:

url='http://www.baidu.com/'user_agent = random.choice(UA_LIST)

headers = {

'User-Agent': user_agent

}

req = request.Request(url=url,headers=headers)

respones = request.urlopen(req)

添加headers頭部信息的方法2:

url='http://www.baidu.com'

headers = {

'User-Agent': user_agent

}

#添加user-agent的方法2

req = request.Request(url)

#請求添加user-agent

req.add_header("User-Agent",user_agent)

#獲取請求的user-agent agent的a要小寫

print(req.get_header("User-agent"))

response = request.urlopen(req)print(respones.read().decode('utf-8'))

三、request的高級類

在urllib.request模塊裡的BaseHandler類,他是所有其他Handler的父類,他是一個處理器,比如用它來處理登錄驗證,處理cookies,代理設置,重定向等。它提供了直接使用和派生類使用的方法:

Handler的子類包括:

HTTPDefaultErrorHandler:用來處理http響應錯誤,錯誤會拋出HTTPError類的異常
HTTPRedirectHandler:用於處理重定向
HTTPCookieProcessor:用於處理cookies
ProxyHandler:用於設置代理,默認代理為空
HTTPPasswordMgr:永遠管理密碼,它維護用戶名和密碼錶
HTTPBasicAuthHandler:用戶管理認證,如果一個連結打開時需要認證,可以使用它來實現驗證功能

(一)ProxyHandler

如果爬蟲需要大量爬取網站數據,為了避免被封號,需要使用代理,通過request.build_opener()方法生成一個opener對象,添加代理的方法如下:

from urllib import request

 

#代理開關,表示是否開啟代理

proxyswitch =True

 

#構建一個handler處理器對象,參數是一個字典類型,包括代理類型和代理伺服器IP+PORT

proxyhandler = request.ProxyHandler({"http":"191.96.42.80:3128"})

#如果是帶用戶名和密碼的代理,格式為{"http":"username:passwd@191.96.42.80:3128"}

 

#不加代理的handler處理器對象

nullproxyhandler = request.ProxyHandler()

 

if proxyswitch:

opener = request.build_opener(proxyhandler)

else:

opener = request.build_opener(nullproxyhandler)

 

req = request.Request("http://www.baidu.com/")

 

response = opener.open(req)

 

print(response.read().decode("utf-8"))

(二)ProxyBasicAuthHandler

通過密碼管理器的方法實現代理伺服器功能

from urllib import request

#代理密碼管理,也可以管理伺服器帳戶密碼

 

#帳戶密碼

user = "username"

passwd = "passwd"

 

#代理伺服器

proxyserver = "1.1.1.1:9999"

 

#構建密碼管理對象,保存需要處理的用戶名和密碼

passmgr = request.HTTPPasswordMgrWithDefaultRealm()

 

#添加帳戶信息,第一個參數realm是與遠程伺服器相關的域信息

passmgr.add_password(None,proxyserver,user,passwd)

 

#構建基礎ProxyBasicAuthHandler處理器對象

proxyauth_handler = request.ProxyBasicAuthHandler(passmgr)

 

opener = request.build_opener(proxyauth_handler)

 

req = request.Request("http://www.baidu.com/")

 

response = opener.open(req)

(三)ProxyBasicAuthHandler

通過密碼管理器的方法實現web認證登陸功能

#web驗證

from urllib import request

 

test = "test"

passwd = "123456"

 

webserver = "1.1.1.1"

 

#構建密碼管理器handler

passwdmgr = request.HTTPPasswordMgrWithDefaultRealm()

#添加密碼信息

passwdmgr.add_password(None,webserver,test,passwd)

 

#HTTP基礎驗證處理器類

http_authhandler = request.HTTPBasicAuthHandler(passwdmgr)

 

opener = request.build_opener(http_authhandler)

 

req = request.Request("http://"+webserver)

 

response = opener.open(req)

四、Cookie處理

 通過http.cookiejar中的HTTPCookieProcessor構建cookie處理器對象,處理cookie信息

import http.cookiejar

from urllib import request,parse

#模擬登陸先post帳戶密碼

#然後保存生成的cookie

 

#通過CookieJar類構件一個coociejar對象,從來保存cookie值

cookie = http.cookiejar.CookieJar()

 

#構件cookie處理器對象,用來處理cookie

cookie_handler = request.HTTPCookieProcessor(cookie)

 

#構件一個自定義的opener

opener = request.build_opener(cookie_handler)

 

#通過自定義的opener的addheaders參數,可以添加HTTP報頭參數

opener.addheaders = [("User-Agent","Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML, like Gecko)"),]

 

#需要登陸的接口

url = 'http://www.renren.com/PLogin.do'

 

#需要登陸的帳戶密碼

data = {

"email":"renren帳號",

"password":"密碼"

}

#數據處理

data = bytes(parse.urlencode(data),'utf-8')

#第一次是POST請求,通過登陸帳戶密碼,得到cookie

req = request.Request(url,data=data)

#發送第一次POST請求,生成登陸後的cookie

response = opener.open(req)

 

print(response.read().decode("utf-8"))

 

#此時的opener已經包含了該連結下的cookie,此時使用該opener就可以直接訪問該站點下其他的網頁而不需要再登陸了

opener.open(http://www.renren.com/PLogin.doxxxxxxxxxxxxx)

以上就是python爬蟲基礎之urllib的使用的詳細內容

歡迎大家點讚,留言,轉發,轉載,感謝大家的相伴與支持

萬水千山總是情,點個【在看】行不行

*聲明:本文於網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯繫我們刪除或授權事

相關焦點

  • Python爬蟲之urllib庫—爬蟲的第一步
    Python有一個內置的urllib庫,可謂是爬蟲過程非常重要的一部分了。這個內置庫的使用就可以完成向伺服器發出請求並獲得網頁的功能,所以也是學習爬蟲的第一步了。----被urllib使用的response類 這4個屬性中最重要的當屬request了,它完成了爬蟲大部分的功能,我們先來看看request是怎麼用的。
  • Python爬蟲 | 0x6 - 請求庫:urllib
    常用屬性及函數調用示例如下:import urllib.requestresp = urllib.request.urlopen("https://www.python.org")print("resp.geturl
  • Python爬蟲常用庫之urllib詳解
    /', timeout=1) 8except error.HTTPError as e: 9 print(e.reason(), e.code(), e.headers())10except error.URLError as e:11 print(e.reason)因為有時這個ip或許也被封了,有可能會拋出異常,所以我們為了讓程序運行下去進而進行捕捉程序
  • Python爬蟲核心模塊urllib的學習
    因為在玩Python challenge的時候,有用過這個模塊,而且學習這個模塊之後也對系統學習網絡爬蟲有用。
  • Python爬蟲之基本庫的使用
    引言學習爬蟲,最初的操作便是模擬瀏覽器向伺服器發出請求,那麼我們需要從哪個地方開始做起呢?請求需要我們自己來構造嗎?需要關心請求這個數據結構的實現嘛?需要了解HTTP、TCP、IP層的網絡傳輸通信嗎?需要直到伺服器的響應和應答原理嗎?
  • python 安全之 urllib 模塊
    python 的爬蟲腳本中經常用到的一個模塊,常用的還有 urllib3 ,requests 模塊等等,這裡先介紹 urllib。註:這裡使用的是 python3 的環境,在 python2 中,urllib 被分為 urllib,urllib2 等。用 urllib.request 模塊的 urlopen() 獲取頁面,page 的數據格式為 bytes 類型,需要 decode() 解碼,轉換成 str 類型。
  • Python網絡爬蟲(二)- urllib爬蟲案例
    # -*- coding:utf-8 -*-#引入需要的模塊import urllib #用於進行中文編碼import urllib2  #用於進行爬蟲核心處理#定義一個函數,用於爬取對應的數據def load_url(url,file_name):    '''    作用:針對指定的
  • 10-python爬蟲之lxml庫
    http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml初步使用首先我們利用lxml來解析 HTML 代碼,先來一個小例子來感受一下它的基本用法。使用 lxml 的 etree 庫,然後利用 etree.HTML 初始化,然後我們將其列印出來。
  • Python爬蟲:一些常用的爬蟲技巧總結
    也差不多一年多了,python應用最多的場景還是web快速開發、爬蟲、自動化運維:寫過簡單網站、寫過自動發帖腳本、寫過收發郵件腳本、寫過簡單驗證碼識別腳本。爬蟲在開發過程中也有很多復用的過程,這裡總結一下,以後也能省些事情。
  • Python 學習:urllib 簡介
    然而我依然認為知道如何不依賴第三方庫打開 URL 並與之進行交互是很有用的,而且這也可以幫助你理解為什麼 requests 包是如此的流行。urllib.requesturllib.request 模塊期初是用來打開和獲取 URL 的。
  • Python 爬蟲:8 個常用的爬蟲技巧總結!
    用python也差不多一年多了,python應用最多的場景還是web快速開發、爬蟲、自動化運維:寫過簡單網站、寫過自動發帖腳本、寫過收發郵件腳本
  • Python開發簡單爬蟲【學習資料總結】
    Python的網頁下載器 urllib2 (Python3以後將urllib2替換為urllib.request) requests urllib2 方法1:給定url,使用urllib2模塊的urlopen方法。
  • Python中爬蟲框架或模塊的區別
    Python中爬蟲框架或模塊的區別 (1)爬蟲框架或模塊 Python自帶爬蟲模塊:urllib、urllib2 ; 第三方爬蟲模塊:requests,aiohttp;
  • python爬蟲之selenium抓取淘寶商品信息
    簡介本節採用python爬蟲相關技術獲取淘寶商品信息。採用的技術有selenium、pyquery及urllib.parse等。selenium可以模擬用戶執行的操作,是一個自動化測試工具,我們可以根據自己的需要預先設置selenium按照我們設置好的步驟進行操作,而在爬蟲中我們使用selenium可以解決javascript動態執行代碼的問題,不用費心去解析js如何運行,運行後產生的信息,直接使用selenium模擬實際登陸網頁的操作,獲取我們需要的信息進行分析,成功幫我們避開一系列複雜的通信過程,方便使用者。
  • python爬蟲小知識,中文在url中的編碼解碼
    有時候我們做爬蟲經常會遇到這種編碼格式,大概的樣式為 %xx%xx%xx,對於這部分編碼,python提供了一個quote的方法來編碼,對應的解碼為unquote方法。導入quote方法是urllib庫的一個方法,它的導入方式為from urllib.parse import quote,unquote不需要安裝,urllib庫是python自帶的一個庫,直接導入就可以使用。
  • @程式設計師,想要基於 Python 3.4 玩爬蟲該看些什麼?
    與之不同的是,網絡爬取通常是以通用的方式構建的,其目標是一系列頂級域名的網站或是整個網絡。爬取可以用來收集更具體的信息,不過更常見的情況是爬取網絡,從許多不同的站點或頁面中獲取小而通用的信息,然後跟蹤連結到其他頁面中。除了爬取和抓取外,我們還會在第 8 章中介紹網絡爬蟲。爬蟲可以用來爬取指定的一系列網站,或是在多個站點甚至整個網際網路中進行更廣泛的爬取。
  • Python2.6低版本Python如何實現爬蟲功能
    43, in <module>import urllib3File "/usr/lib/python2.6/site-packages/urllib3/__init__.py", line 7, in <module>from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool
  • Python新手學習網絡爬蟲要做什麼?
    三、urllib、urllib2兩個庫很重要urllib和urllib2個庫是我們在抓取頁面要用的。在python中,urllib和urllib2不可相互替代,雖然urllib2是urllib的增強,但是urllib中有urllib2中所沒有的函數。
  • 適合新手學習的Python爬蟲書籍
    《用Python寫網絡爬蟲》作為使用Python來爬取網絡數據的傑出指南,講解了從靜態頁面爬取數據的方法以及使用緩存來管理伺服器負載的方法。此外,本書還介紹了如何使用AJAX URL和Firebug擴展來爬取數據,以及有關爬取技術的更多真相,比如使用瀏覽器渲染、管理cookie、通過提交表單從受驗證碼保護的複雜網站中抽取數據等。本書使用Scrapy創建了一個高級網絡爬蟲,並對一些真實的網站進行了爬取。Python網絡數據採集
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    想要入門Python 爬蟲首先需要解決四個問題:1.熟悉python編程2.了解HTML3.了解網絡爬蟲的基本原理4.學習使用python爬蟲庫1、熟悉python編程剛開始入門爬蟲,初學者無需學習python的類,多線程,模塊和其他稍微困難的內容。