1. 程式人生 > >python爬蟲讀書筆記(2)

python爬蟲讀書筆記(2)

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)