Python爬蟲urllib庫的使用

urllibhtml

在Python2中,有urllib和urllib2兩個庫實現請求發送,在Python3中,統一爲urllib,是Python內置的HTTP請求庫python

request:最基本的HTTP請求模塊,能夠模擬發送請求。瀏覽器

error:異常處理模塊服務器

parse:一個工具模塊,提供了許多URL處理方法,拆分、解析、合併等數據結構

rebotparser:主要用來識別網站的robots.txt文件,判斷哪些文件能夠爬,哪些文件不能夠爬socket

 

 

urlopen() :urlopen.request模塊提供了最基本的構成HTTP請求的方法,能夠模擬瀏覽器請求的發起過程jsp

實例:ide

import urllib.request   #調用 urllib的request方法工具

response = urllib.request.urlopen(‘http://www.baidu.com’)    #請求百度網站post

print(response.read().decode('utf-8'))              #輸出網站內容,設置編碼utf-8

print(response.status)         #網頁響應狀態碼

print(response.getheaders())       #獲取請求頭信息

print(response.getheaders('Server'))     #獲取響應頭中的 Server值,獲取服務器

 

 參數:

data():data參數是可選的,若是添加該參數,須要使用bytes()方法將參數轉化爲字節流編碼格式的內容,即betyes類型,若是傳遞了這個參數,請求方式再也不是get,二是post

實例:

import urllib.parse

import urllib.request

data = bytes(urllib.parse.urllencode({'word':'hello'}),encoding='utf8')    #傳遞一個參數word,值是hello,轉碼成bytes類 型,該方法第一個參數是要str類型,用urllib.parse模塊裏的urlencode()方法轉化爲字符串

response = urllib.request.urlopen('http://httpbin.org/post',data=data)            #請求站點是httpbin.org,能夠提供http測試,這個連接能夠測試post請求,能夠輸出請求信息,包含咱們傳遞的data參數

print('response.read()')             #傳遞的參數在form字段中說明模擬了表單提交方式,以post方式傳輸

 

 

timeout():timeout 參數用於設置超時時間,單位爲秒,意思是若是請求超出了設置時間,尚未獲得響應,就會拋出異常,若是不指定,就會使用全局默認時間,支持 HTTP  HTTPS FTP請求

實例:

import urllib.request

import socket

import urllib.error

try:

  response = urllib.request.urlopen('http://httpbin.org/get',timeout=1)     #請求httpbin.org測試連接,設置超時時間1秒,.

except urllib.error.URLError as e:        #捕獲異常

  if isinstance(e.reason,socket.timeou)         #socket.timeout  判斷異常是超市異常 

    pritn(‘TIME OUT’)        

 

 

Request:利用urllib.urlopen()方法能夠完成簡單的請求,可是不足以構建一個完整的請求,若是須要加headers等信息,就須要利用更強大request方法來構建

實例:

import urllib.request

request = urllib.urlopen('https://python.org')    

 response = urllib.request.get(request)

print(response.read()).deaode('utf-8') 

#能夠發現,咱們依然用urlopen()方法來發送請求,只不過此次該方法的參數再也不試url,而是request類型的對象,經過構造這個數據結構,一方面能夠將請求獨立成一個對象,另外一方面能夠靈活的配置參數

 

 

網站身份驗證:

 

實例:

form urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler,build_opener

from urllib.error import URLError

 

username = 'username'

password = 'password'

url = 'http://localhost:5000'

 

p = HTTPPasswordMgrWithDefaultRealm()   #實例化HTTPBasicAuthHandler對象,其參數是HTTPPasswordMgrWithDefaultRealm對象

p.add_password(None,url,username,pasword)  #經過 add_password()添加進去用戶名和密碼,這樣就創建了一個處理驗證的handler

auth_handler =HTTPBasicAuthHandler(p)       

opener = buid_oppener(auth_handler)        #利用handler使用build_opener()方法構建了一個Opener,這個Opener在發送請求時就至關於驗證成功

try:

  result = opener.open(url)

  html = result.read().decode('utf-8')

  pritn(html)

except URLErrot as e:

  print(e.reason)

 

 

代理IP:

from urllib.error import URLError

from urllib,request import ProxyHandler,biuld_opener

porxy_handler = Proxyhandler({

  'http':'http://127.0.0.1:9743',

  'https':'https://127.0.0.1:9743'          

})

opener = build_opener(proxy_handler)

try:

  response = eopner.open('https://www.baidu.com')

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

except URLError as e:

  pritn(e.reason)

#在本地搭建一個代理,運行在9743端口,使用了Proxyhandler,參數是一個字典,健名是協議類型,值是代理連接,能夠添加多個代理,而後使用handler以及build_opener()方法構造一個 opener,以後發送請求便可

 

urlparse():該方法能夠實現入了的識別和分段

 

分析robots協議:

robots協議也叫爬蟲協議,機器人協議,它的全貌叫忘了爬蟲排除標準,用來告訴爬蟲和搜索引擎哪些頁面能夠抓取,哪些不能夠抓取,它一般是一個叫作robots.txt的文本文件,通常放在網站的根目錄下

當搜索爬蟲訪問一個站點時,它首先檢查這個站點根目錄下是否存在robots.txt文件,若是存在,搜索爬蟲會根據其中定義的爬取範圍來爬取,若是沒有找到這個文件,搜索爬蟲會返耐高溫全部能夠直接訪問的頁面

 

robots.txt 樣例:

User-agent:*

Disallow:/

Allow:/public/

這實現了對全部搜索爬蟲只容許爬取public目錄的功能,將上述內容保存成robots.txt文件,放在網站的根目錄下,和網站的入口文件好比(index.pho  index.html  index.jsp等等)放在一塊兒

 

上面的User-agent描述了搜索爬蟲的名稱,這裏將其設置爲*則表明該協議對任何爬取爬蟲有效,好比,咱們能夠設置 :user-agent:baiduspider

這就表明咱們設置的規則對百度爬蟲是有效果,若是有多條user-agent的記錄,則就會有多個爬蟲會受到爬取限制,可是至少指定一條

 

disallow指定了不容許爬取的目錄。好比上個例子設置爲/,則表明不容許抓取全部頁面

allow通常和disallow一塊兒使用,通常不會單獨使用,用來排除某些限制,限制咱們設置爲/public/,則表示全部頁面不容許抓取,可是能夠抓取public目錄

下面再看幾個例子:

user-agent:* 

Disallow:/                #禁止全部爬蟲訪問任何目錄

----------------------------------------------------------------

 

user-agent:* 

 

Disallow:/  private/

Disallow:/tmp/           #容許全部爬蟲訪問網站某些目錄

-------------------------------------------------------------------------

user-agent:WebCrawler

Disallow:/

user-agent:*

Disallow:/        #只容許一個爬蟲訪問

---------------------------

user-agent:* 

 

Disallow:     #容許全部爬蟲訪問,robots.txt留空也能夠

 

原文出處:https://www.cnblogs.com/qi_1998/p/10289510.html

相關文章
相關標籤/搜索