1. urllib.request網路資源訪問
robotparser為robots.txt檔案格式實作一個決議器,提供了一個函式來檢查給定的用戶代理是否可以訪問一個資源,這個模塊可以用于合法蜘蛛或者需要抑制或限制的其他爬蟲應用中,
1.1 robots.txt
robots.txt檔案格式是一個基于文本的簡單訪問控制系統,用于自動訪問Web資源的計算機程式(如“蜘蛛”“爬蟲”等),這個檔案由記錄構成,各記錄會指定程式的用戶代理識別符號,后面是該代理不能訪問的一個URL(或URL前綴)串列,
以下代碼清單顯示了https://pymotw.com/的robots.txt檔案,
Sitemap: https://pymotw.com/sitemap.xml User-agent: * Disallow: /admin/ Disallow: /downloads/ Disallow: /media/ Disallow: /static/ Disallow: /codehosting/
這個檔案會阻止訪問網站中某些計算資源代價昂貴的部分,如果搜索引擎試圖索引這些部分,那么可能會讓服務器負載過重,要得到更完整的robots.txt示例集,可以參考Web Robots頁面,
1.2 測驗訪問權限
基于之前提供的資料,一個簡單的爬蟲應用可以使用RobotFileParser.can_fetch()測驗是否允許下載一個頁面,
from urllib import parse from urllib import robotparser AGENT_NAME = 'PyMOTW' URL_BASE = 'https://pymotw.com/' parser = robotparser.RobotFileParser() parser.set_url(parse.urljoin(URL_BASE, 'robots.txt')) parser.read() PATHS = [ '/', '/PyMOTW/', '/admin/', '/downloads/PyMOTW-1.92.tar.gz', ] for path in PATHS: print('{!r:>6} : {}'.format( parser.can_fetch(AGENT_NAME, path), path)) url = parse.urljoin(URL_BASE, path) print('{!r:>6} : {}'.format( parser.can_fetch(AGENT_NAME, url), url)) print()
can_fetch()的URL引數可以是一個相對于網站根目錄的相對路徑,也可以是一個完全URL,

1.3 長壽命蜘蛛
如果一個應用需要花很長時間來處理它下載的資源,或者受到抑制,需要在下載之間暫停,那么這樣的應用應當以它已下載內容的壽命為根據,定期檢查新的robots.txt檔案,這個壽命并不是自動管理的,不過有一些簡便方法可以方便地跟蹤其壽命,
from urllib import robotparser import time AGENT_NAME = 'PyMOTW' parser = robotparser.RobotFileParser() # Using the local copy parser.set_url('file:robots.txt') parser.read() parser.modified() PATHS = [ '/', '/PyMOTW/', '/admin/', '/downloads/PyMOTW-1.92.tar.gz', ] for path in PATHS: age = int(time.time() - parser.mtime()) print('age:', age, end=' ') if age > 1: print('rereading robots.txt') parser.read() parser.modified() else: print() print('{!r:>6} : {}'.format( parser.can_fetch(AGENT_NAME, path), path)) # Simulate a delay in processing time.sleep(1) print()
這個例子有些極端,如果已下載的檔案壽命超過一秒,那么它就會下載一個新的robots.txt檔案,

作為一個更好的長壽命應用,在下載整個檔案之前可能會請求檔案的修改時間,另一方面,robots.txt檔案通常很小,所以在此獲取整個檔案的開銷并不昂貴,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/160526.html
標籤:Python
上一篇:Flask開發-虛擬環境創建
