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