在python3 的基礎上實現的,但是相對於作者的**少了支援**部分和避免爬蟲陷阱部分,**寫入了自己寫的注釋,暫時的理解就是這樣了,希望有看到的朋友可以指正一下,小白成長中。。。
import urllib.request
import urllib.error
import re
import urllib.parse
from urllib.parse import urljoin
import urllib.robotparser
import time
from datetime import datetime
def download(url,user_agent='wswp',proxy=none,num_retries=2):
print('downloading:', url)
headers=
request = urllib.request.request(url,headers=headers)
opener = urllib.request.build_opener()
# urlopen()函式不支援驗證、cookie或者其它http高階功能。要支援這些功能,必須使用build_opener()函式建立自定義opener物件
# #用正規表示式提取sitemap鏈結
# links=re.findall('(.*?)',sitemap)
# for link in links:
# html=download(link)
def link_crawler(seed_url,link_regex,user_agent='wswp',delay=5):
crawl_queue=[seed_url]
rp=get_robots(seed_url)
seen=set(crawl_queue)
while crawl_queue:
url=crawl_queue.pop()
#從列表中取出url,此時列表為空
if rp.can_fetch(user_agent,url):
#確定指定的使用者**是否允許訪問網頁
html=download(url)
#呼叫download函式開啟並解析**
for link in get_links(html):
#遞迴迴圈get_links函式中得到的每一條鏈結
if re.match(link_regex,link):
#如果有與正規表示式相匹配的鏈結就取出來
link =urllib.parse.urljoin(seed_url,link)
#用urlparse將相對鏈結轉化為絕對鏈結
if link not in seen:
#檢驗集合中是否已經有了這個鏈結
seen.add(link)
#當集合中沒有這個鏈結時新增到集合中
# print(crawl_queue)
else:
print('block by robots.txt:',url)
def get_robots(url):
rp=urllib.robotparser.robotfileparser()
rp.set_url(urllib.parse.urljoin(url,'/robots.txt'))
rp.read()
return rp
#獲取網頁中所有鏈結
def get_links(html):
#正規表示式四去匹配網頁中所有的鏈結
webpage_regex = re.compile(']+href=["\'](.*?)["\']', re.ignorecase)
return webpage_regex.findall(html)
class throttle:
def __init__(self,delay):
self.delay=delay
#上次訪問域時的時間戳
self.domains={}
def wait(self,url):
domain=urllib.parse.urlparse(url).netloc
#解析url格式取出netloc即『example.webscraping.com』
last_accessed=self.domains.get(domain)
if self.delay>0 and last_accessed is not none:
sleep_secs=self.delay-(datetime.now()-last_accessed).seconds
#將指定延時與當前時間距離上次訪問時間作比較
if sleep_secs>0:
time.sleep(sleep_secs)
#如果當前時間距離上次訪問時間小於指定延時,則執行睡眠操作
self.domains[domain]=datetime.now()
#更新訪問時間為當前時間
if __name__ == '__main__':
link_crawler('', '/(index|view)',delay=0,user_agent='badcrawler')
link_crawler('', '/(index|view)',delay=0, user_agent='goodcrawler')
執行部分結果:
python網路爬蟲(第一章)
內容來自於o reilly 人民郵電出版社 的 python網路爬蟲權威指南 此部落格僅用於記錄學習,方便以後使用 目前本系列文章 python網路爬蟲筆記 更新情況 第一章 本文 第二章 python網路爬蟲 第二章 簡單例項 python網路爬蟲 簡單例項 print title 1 urlli...
爬蟲第一章
爬蟲基礎 什麼是爬蟲?爬蟲是通過程式模擬瀏覽器上網,從網上獲取資料的過程.爬蟲的分類 通用爬蟲 爬取一整個頁面的資料.聚焦爬蟲 爬取頁面中指定的區域性資料 增量式爬蟲 檢測 中資料更新的情況,爬取的是 中最新更新出來的資料.什麼是反爬機制?製作時設定的一系列阻止爬蟲程式進行的阻礙,就是反爬機制,反爬...
python爬蟲學習 第一章 爬蟲基礎
通過編寫程式,模擬瀏覽器上網,然後讓其去網際網路上抓取資料的過程。比如 電商願意被比價 或者購物資訊 爬取資訊,因為可以為他們的商品帶來更多的流量 而不願意被同行爬取 資訊,或者產品資訊 但是很多電商又會去爬取同行的商品資訊。如何解決這個矛盾?反爬機制 門戶 可以通過制定相應的策略或者技術手段,防止...