【一塊兒學爬蟲】Urllib庫的使用

#回顧 由上一篇文章知道:經過python代碼向服務器發送request,而後經過獲取response就能夠獲取到網頁的內容了。那麼python如何向網站發起請求呢?這個過程又是如何實現的呢?html

Urllib

python的Urllib庫爲咱們實現了想瀏覽器發起請求的過程,Urllib是python內置的一個http請求庫(不須要額外的手動安裝),除了發起request,Urllib還提供了比較強大的url解析函數。 java

urllib庫.png

其中:python

  • request模塊是用來模擬人工點擊,向網站發起request
  • err是異常處理模塊:若是出現請求錯誤。能夠捕捉這個異常,而後進行重試或者其餘操做,保證程序不會意外的終止。
  • parse是一個根據模塊,提供了不少URL處理方法:拆分合並之類的
  • robotparser:主要是依賴識別網站的robots.txt文件,而後判斷哪些網站是能夠爬去的,哪些是不能夠爬取的,使用的比較少。
import urllib.requst
response = urllib.request.urlopen('http://www.baidu.com')
複製代碼

urllib其實不太好用,後面會介紹其餘更好用的庫:它是基於Urllib庫來實現的。urllib做爲最基本的請求庫,這裏仍是介紹一下urllib庫的基本原理和使用。面試

##request.urlopen()函數介紹 urllib.request.urlopen( url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None )json

其中瀏覽器

  • url: 須要打開的網址
  • data:Post提交的數據,應該是byte類型的數據
  • timeout:設置網站的訪問超時時間

###urlopen返回的response對象提供方法: -  read() , readline() ,readlines() , fileno() , close() :對HTTPResponse類型數據進行操做,返回的是byte類型的數據,須要使用decode方法轉換爲字符串,獲取響應體的內容 -   info():返回HTTPMessage對象,表示遠程服務器返回的頭信息 - getcode():返回Http狀態碼。若是是http請求,200請求成功完成 ; 404網址未找到 - geturl():返回請求的url服務器

####案例:cookie

  1. 測試get請求
from urllib import request
response = request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))
複製代碼

上面代碼打印出來的是瀏覽器訪問「www.baidu.com」時返回的第一個html頁面: socket

request.urlopen.jpg

注:若是你在瀏覽器中看不到上面的源代碼,能夠清除cookie試試函數

2.測試post請求

from urllib import request
from urllib import parse 
#request.urlopean(url,data,)
data = bytes(parse.urlencode({'word':'hello'}),encoding='utf-8')
response = request.urlopen('http://httpbin.org/post',data=data);#這是一個HTTP測試網站
print(response.read().decode('utf-8'))
複製代碼

上面代碼的輸出的是json格式

urllibPost.png

3.超時設置:在規定時間沒有獲得響應就會拋出異常

from urllib import request
response = request.urlopen('http://httpbin.org/get',timeout=0.1);#這是一個HTTP測試網站,超時時間設置爲0.1秒
print(response.read().decode('utf-8'))
複製代碼

上面代碼會報異常:socket.timeout: timed out

下面代碼輸出的是:TimeOut

from urllib import request
from urllib import error
import socket
try:
    response = request.urlopen('http://httpbin.org/get',timeout=0.1);#超時0.1s
except error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print('TimeOut')
複製代碼

上面是urlopen使用,即發如何發起request請求,下面介紹response相關知識點

#response

  1. response的類型:
from urllib import request
response = request.urlopen('http://www.python.org');
print(type(response))
複製代碼

輸出的結果是: 打印出來的是: class 'http.client.HTTPResponse'

2.response中的主要成員:狀態碼和響應頭

from urllib import request
response = request.urlopen('http://www.python.org');
print(response.status)
print(response.getheaders());
print(response.getheader('server'))#獲取響應頭中的某一個取值
複製代碼

輸出結果:

response內容.jpg

上面結果對應瀏覽器的下面結果:

瀏覽器response.jpg

3.獲取response響應體的內容

from urllib import request
response = request.urlopen('http://www.python.org');
print(response.read.decode('utf-8'))
複製代碼

輸出的內容在文章開頭的get請求中以已經介紹了

#Request對象

  • urlopen能夠傳入一個Request對象,咱們能夠在Request對象中配置header,method等
    request對象.png

執行結果:

結果.png

另一種添加header的方式:

添加head方式.png

#代理:Handle

  • 能夠經過代理假裝本身的IP,爬取數據的時候服務器獲取到的是代理的IP地址:
from  urllib import request
proxy_handle = request.ProxyHandle({
    ‘http':http://代理ip
    'https':https://代理IP
})
opener = request.builder_opener(proxy_handle)
response = opener.open('www.baidu.com')
複製代碼

##cookie 在爬蟲中,cookie主要是用來維持用戶帳號的登陸狀態 1.cookie的獲取

#---------------獲取cookie
from http import cookiejar
from urllib import request
cookie = cookiejar.CookieJar()
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
    print(item.name+' = '+item.value)
複製代碼

2.**cookie保存:**由於cookie能夠用來保持登陸信息的,因此能夠把cookie保存成文本文件。若是cookie沒有失效,咱們能夠從文件讀取cookie,並將cookie附加在request中:

#---------------保存cookie
from http import cookiejar
from urllib import request
filename= 'cookie.txt'
cookie = cookiejar.MozillaCookieJar(filename)

handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True)
複製代碼

3.cookie:cookie能夠保存成不一樣的格式,可是這不過重要,你使用什麼格式存儲的就使用什麼格式讀取就好,下面是另一種cookie保存格式,主要是類

#---------------保存cookie另一種格式
from http import cookiejar
from urllib import request
filename= 'cookie.txt'
cookie = cookiejar.LWPCookieJar(filename)

handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True)
複製代碼
  1. 裝載cookie
#---------------讀取cookie
from http import cookiejar
from urllib import request
filename= 'cookie.txt'
cookie = cookiejar.LWPCookieJar(filename)

cookie.load('cookie.txt',ignore_discard=True,ignore_expires=True);

handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))
複製代碼

#異常處理

from urllib import request,error
try:
    response = request.urlopen('網址')#當網頁不存在的時候,異常能夠捕獲到,程序不會終止退出
except error.URLError as e:
    print(e.reason)
複製代碼

上面的異常也能夠像java那樣分類捕捉異常,主要有三個error: 1.URLError 2.HTTPError(URLError的子類) 3.ContentTooShortError

#parse,URL解析

from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result,result))
複製代碼

type:class 'urllib.parse.ParseResult' result: scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment'

  • urlparse:url的切分
  • urlunparse:將幾部分字符串合成一個url
from urllib.parse import urunlparse
data = ['http','www.baidu.com','index.html','a=6','comment']
print(urlunparse(data))
#http://www.baidu.com/index.html?a=6#comment
複製代碼
  • url拼接:urljoin,urlencode
    urljoin.png

urlencode將以字典形式組織的參數拼接到url上

資料分享

java學習筆記、10T資料、100多個java項目分享


歡迎關注我的公衆號【菜鳥名企夢】,公衆號專一:互聯網求職面經javapython爬蟲大數據等技術分享**: 公衆號**菜鳥名企夢後臺發送「csdn」便可免費領取【csdn】和【百度文庫】下載服務; 公衆號菜鳥名企夢後臺發送「資料」:便可領取5T精品學習資料**、java面試考點java面經總結,以及幾十個java、大數據項目資料很全,你想找的幾乎都有

掃碼關注,及時獲取更多精彩內容。(博主今日頭條大數據工程師)
相關文章
相關標籤/搜索