python爬蟲讀書筆記(2)
阿新 • • 發佈:2018-11-09
1.網站地圖爬蟲
def crawl_sitemap(url):
#下載網站地圖檔案
sitemap=download(url)
#正則表示式,從<loc>標籤中提取出URL,獲得網站地圖連結
links=re.findall('<loc>(.*?)</loc>',sitemap)
#下載每個連結
for link in links:
html=download(link)
#抓取的網站
2.ID遍歷爬蟲
(1)對ID進行遍歷,直到出現下載錯誤時停止。
缺陷:某些記錄可能已被刪除,資料庫ID之間並不是連續的。此時,只要訪問到某個間隔點,爬蟲就會立刻退出。
import itertools for page in itertools.count(1): url='http://example.webscrapping.com/view/-%d' %page html=download(url) if html is None: break else: pass
(2)該版本中途連續發生多次下載錯誤後才會退出程式。
import itertools #允許最大連續數量的下載的錯誤 max_errors=5 #目前連續下載錯誤的數量 num_errors=0 for page in itertools.count(1): url='http://example.webscrapping.com/view/-%d' %page html=download(url) if html is None: #在這個網頁上嘗試下載收到的錯誤資訊 num_errors+=1 if num_errors==max_errors: break else: #能夠成功爬取結果 num_errors=0
3.連結爬蟲
使用正則表示式來確定需要下載哪些頁面。
(1)使用正則表示式確定需要下載的頁面。但是該連結只有網頁的路徑部分,沒有協議和伺服器部分,也就是這是一個相對連結,瀏覽器知道你在瀏覽哪個網頁, 所以在瀏覽器瀏覽時, 相對連結是能夠正常工作的。但 是,urllib2是無法獲知上下文的。
import re def link_crawl(seed_url,link_regex): crawl_queue=[seed_url] while crawl_queue: url=crawl_queue.pop() html=download(url) #匹配正則表示式 for link in get_links(html): if re.match(link_regex,link): crawl_queue.append(link) def get_links(html): webpage_regex=re.compile('<a[^>]+href=["\'](.*?)["\']',re.IGNORECASE) return webpage_regex.findall(html)
(2)儲存已發現URL的功能,避免重複爬取相同的連結
import re import urlparse def link_crawler(seed_url,link_regex): crawl_queue=[seed_url] #保持跟蹤哪個URL連結在之前被跟蹤過 seen=set(crawl_queue) while crawl_queue: url=crawl_queue.pop() html=download(url) #匹配正則表示式 for link in get_links(html): if re.match(link_regex,link): #絕對路徑 link=urlparse.urljoin(seed_url,link) #檢查是否曾經看過這個連結 if link not in seen: seen.add(link) crawl_queue.append(link)