Python 的簡潔語法和豐富的第三方函式庫,使其成為構建網頁爬蟲的理想選擇。本文將逐步解析如何使用 Python 建立一個功能完善的網頁爬蟲,從網頁內容擷取、檔案下載到目錄自動管理,涵蓋網頁爬蟲開發的關鍵環節。過程中會使用 Beautiful Soup 解析 HTML 結構、使用 Mechanize 模擬瀏覽器行為、使用 urllib 下載目標檔案,並利用 os 模組進行目錄操作,確保檔案的規範儲存。

建立網頁爬蟲的基本技術

玄貓這裡要分享的是如何從頭開始編寫一個基本的網頁爬蟲(Web Bot)。這個過程涉及多個步驟,包括初始化TCP連線、請求頁面、解析內容、下載檔案以及跟隨連結。這些步驟看似簡單,但實際操作中需要考慮許多細節。

正規表示式的簡介

在這裡我們先來介紹一下正規表示式(Regular Expressions),這是一種非常靈活的文字搜尋方法。正規表示式可以用來在文字中搜尋特定的字元序列,並且可以處理一些複雜的模式比對。舉個例子,以下的正規表示式 (?<=-)\w+ 可以用來搜尋字串中緊接在連字元後面的字元序列。

檢視範例

import re
m = re.search('(?<=-)\w+', 'free-bird')
print(m.group(0))

這段程式碼會輸出 "bird",因為它找到了 "bird" 這個字元序列,它是 "free-bird" 中緊接在連字元 - 後面的字元序列。

使用 Python 模組編寫網頁爬蟲

編寫網頁爬蟲時,你可以選擇使用多種 Python 模組來完成不同的功能。以下是一些常用的模組和它們的用途:

  • Mechanize:用於自動化網頁瀏覽和表單提交。
  • Beautiful Soup:用於解析 HTML 和 XML 檔案。
  • urllib:用於下載網頁檔案。

Mechanize 模組

Mechanize 是一個非常強大且易於使用的模組,適合用來自動化網頁任務。例如,如果你需要多次登入一個網站並填寫表單,Mechanize 可以幫助你完成這些操作。以下是如何安裝和使用 Mechanize 的步驟:

  1. 下載並安裝 Mechanize:

    wget http://pypi.python.org/packages/source/m/mechanize/mechanize-0.2.5.tar.gz
    tar -xzvf mechanize-0.2.5.tar.gz
    cd mechanize-0.2.5
    sudo python setup.py install
    
  2. 在 Python 中使用 Mechanize:

    import mechanize
    br = mechanize.Browser()
    br.open("http://example.com")
    

Beautiful Soup 模組

Beautiful Soup 是一個非常強大的 HTML 和 XML 解析函式庫。它可以幫助你從下載的頁面中提取出有價值的資訊。安裝 Beautiful Soup 的命令如下:

sudo apt-get install python-bs4

使用 Beautiful Soup 來解析 HTML:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')
links = soup.find_all('a')
for link in links:
    print(link.get('href'))

urllib 模組

urllib 是 Python 的標準函式庫之一,用於開啟和讀取 URL。以下是如何使用 urllib 下載檔案的範例:

import urllib.request

image_url = "http://www.example.com/image.jpg"
local_filename = "image.jpg"
urllib.request.urlretrieve(image_url, local_filename)
小段落標題:內容解密:

這段程式碼會將 image_url 指向的圖片下載到本地並命名為 image.jpg

決定要下載什麼

決定要下載哪些檔案是一個挑戰,因為網際網路上有大量資源,而其中許多都是受版權保護的。因此,在編寫爬蟲時,我們應該關注那些公開可用且不受版權保護的資源。例如,公共領域中的文字檔案(如 Mark Twain 的作品)就是很好的選擇。

這些檔案通常以 .pdf.txt.doc.docx 等格式存在。此外,電子書格式如 .mobi(Kindle)和 .epub 也值得考慮。

Web 機器人開發

在開發網頁機器人(Web Bot)時,選擇合適的起點和儲存位置是至關重要的。以下是玄貓提供的詳細,幫助你從頭開始,並成功建立一個功能強大的網頁機器人。

選擇起點

首先,你需要一個明確的起點。雖然你可能會想到使用 Google 搜尋,但這樣會帶來大量不必要的結果。例如,搜尋「Mark Twain」可能會得到數十萬個結果,這對於你的機器人來說是非常低效的。因此,建議你提前做一些準備工作。

如果你在尋找馬克·吐溫的作品,可以找一個線上檔案館作為起點。如果你在尋找免費音樂下載,可以收集一些部落格名單,這些部落格通常會提供新興音樂家的免費下載連結。同樣地,技術檔案如 IEEE 網路規範,通常可以在技術或政府網站上找到。

儲存檔案

接下來,你需要一個地方來儲存你的檔案。Raspberry Pi 的 SD 卡既作為 RAM 又作為檔案儲存裝置。如果你使用的是 32 GB 的 SD 卡,那麼它有足夠的空間來儲存大量的 PDF 檔案。然而,如果你只有一張 4 GB 的 SD 卡,那麼它可能會很快被填滿,特別是當你下載大型影片檔案時。

因此,建議你使用外部 USB 硬碟或快閃記憶體驅動器來儲存檔案。當然,不是所有外部驅動器都能很好地與 Raspberry Pi 搭配使用。因此,建議你購買一兩個中等尺寸的外部驅動器進行測試。目前玄貓正在使用 DANE-ELEC 的 8 GB 驅動器,沒有遇到任何問題。

使用命令列存取外部驅動器

連線外部驅動器後,你可以透過命令列來存取它。外部驅動器通常會出現在 /media 目錄中。例如:

cd /media

這將讓你進入到外部驅動器所在的目錄。然後你可以導航到該目錄並存取其內容。

編寫 Python 機器人

接下來,我們開始編寫 Python 機器人。以下是基本的 Python 程式碼框架:

from bs4 import BeautifulSoup
import mechanize
import time
import urllib
import string

start = "http://" + raw_input("Where would you like to start searching?\n")
br = mechanize.Browser()
r = br.open(start)
html = r.read()

這段程式碼匯入了所需的模組,並使用 raw_input 函式從使用者那裡取得起點 URL。然後它開啟該 URL ,並將內容讀取到 html 變數中。

接收使用者輸入並解析 HTML

接下來,我們將解析 HTML 內容並提取所有鏈結:

soup = BeautifulSoup(html)
for link in soup.find_all('a'):
    print(link.get('href'))

這段程式碼使用 Beautiful Soup 分析 HTML ,並提取所有超連結(<a> 標籤)。然後我們遍歷每個超連結並列印其 href 屬性。

搜尋和下載檔案

在繼續之前,我們需要一個函式來搜尋和下載特定型別的檔案。首先,我們需要從使用者那裡取得要搜尋的檔案型別:

filetype = raw_input("What file type are you looking for?\n")

然後我們遍歷所有鏈結並檢查其是否比對要搜尋的檔案型別:

for link in soup.find_all('a'):
    linkText = str(link)
    if filetype in linkText:
        # download file code here

這段程式碼將每個鏈結轉換為字串形式,然後檢查其是否包含要搜尋的檔案型別。

測試機器人

為了測試我們的機器人,玄貓設定了一個測試頁面:http://www.irrelevantcheetah.com/browserimages.html 。這個頁面包含了圖片、檔案和各種 HTML 元素。

以下是完整的測試程式碼:

import mechanize
import time
from bs4 import BeautifulSoup
import string
import urllib

start = "http://www.irrelevantcheetah.com/browserimages.html"
filetype = raw_input("What file type are you looking for?\n")
br = mechanize.Browser()
r = br.open(start)
html = r.read()
soup = BeautifulSoup(html)

for link in soup.find_all('a'):
    linkText = str(link)
    fileName = str(link.get('href'))
    if filetype in fileName:
        image = urllib.URLopener()
        linkGet = "http://www.irrelevantcheetah.com" + fileName
        filesave = string.lstrip(fileName, '/')
        image.retrieve(linkGet, filesave)

內容解密:

  • 匯入模組mechanizetimeBeautifulSoupstringurllib 模組分別用於瀏覽網頁、處理時間、解析 HTML 、操作字串和處理 URL。
  • 設定起始 URL 和檔案型別startfiletype 分別從使用者輸入取得。
  • 建立瀏覽器物件mechanize.Browser() 建立了一個瀏覽器物件 br
  • 開啟起始 URLbr.open(start) 用於開啟起始 URL ,並將內容讀取到 html
  • 解析 HTMLBeautifulSoup(html) 建立了一個 Beautiful Soup 物件 soup 用於解析 HTML 。
  • 遍歷超連結:遍歷所有 <a> 標籤並提取其 href 屬性。
  • 檢查檔案型別:如果 href 屬性包含要搜尋的檔案型別(例如 .pdf),則進行下載操作。
  • 下載檔案:使用 urllib.URLopener().retrieve() 下載對應的檔案。

這段程式碼展示瞭如何從零開始建立一個簡單但功能強大的網頁機器人。透過這些步驟,你可以根據自己的需求進一步擴充套件和最佳化機器人。

Web 機器人開發:資料下載與目錄管理

在現代網路世界中,自動化工具的應用越來越廣泛。本文將探討如何開發一個簡單的 Web 機器人,這個機器人能夠瀏覽網頁、下載特定型別的檔案,並自動建立所需的目錄。這不僅能提高工作效率,還能幫助我們更好地管理資料。

機器人核心功能

玄貓認為,Web 機器人的核心功能應該包括以下幾個方面:

  1. 資料下載:從指定網站下載特定型別的檔案。
  2. 目錄管理:自動建立所需的目錄,並確保檔案儲存到正確的位置。
  3. 連結追蹤:追蹤並存取網頁上的連結,進一步下載資料。

程式碼實作

首先,我們需要引入一些必要的模組。這些模組將幫助我們處理網頁內容、管理檔案和目錄。

import mechanize
import time
from bs4 import BeautifulSoup
import re
import urllib
import string
import os

內容解密:

這段程式碼主要引入了以下幾個模組:

  • mechanize:用於模擬瀏覽器操作,方便自動化瀏覽網頁。
  • BeautifulSoup:用於解析 HTML 內容,提取我們需要的資訊。
  • re:用於正規表示式操作,方便文書處理。
  • urllib:用於下載網頁資源。
  • string:用於字串操作。
  • os:用於管理作業系統中的目錄和檔案。

接下來,我們定義了一個名為 downloadProcess 的函式,這個函式負責實際下載檔案並管理目錄。

def downloadProcess(html, base, filetype, linkList):
    "This does the actual file downloading."
    soup = BeautifulSoup(html)
    for link in soup.find_all('a'):
        linkText = str(link.get('href'))
        if filetype in linkText:
            slashList = [i for i, ind in enumerate(linkText) if ind == '/']
            directoryName = linkText[(slashList[0]+1):slashList[1]]
            if not os.path.exists(directoryName):
                os.makedirs(directoryName)
            image = urllib.URLopener()
            linkGet = base + linkText
            filesave = string.lstrip(linkText, "/")
            image.retrieve(linkGet, filesave)
        elif "htm" in linkText: #covers both "html" and "htm"
            linkList.append(link)

內容解密:

這段程式碼主要完成以下工作:

  1. 解析 HTML:使用 BeautifulSoup 解析傳入的 HTML 內容。
  2. 遍歷連結:遍歷所有 HTML 中的連結(<a> 標籤)。
  3. 檔案型別判斷:檢查連結是否包含我們需要的檔案型別。
  4. 目錄管理:從連結中提取目錄名稱,並檢查是否存在該目錄。如果不存在,則建立該目錄。
  5. 檔案下載:使用 urllib.URLopener() 下載檔案。
  6. 連結追蹤:如果連結包含 .htm.html,則將其新增到 linkList 中。

使用者互動

接下來,我們讓使用者輸入起始網址和需要下載的檔案型別。根據使用者輸入的資訊,我們初始化必要的變數並開始下載過程。

start = "http://" + raw_input("Where would you like to start searching?\n")
filetype = raw_input("What file type are you looking for?\n")
numSlash = start.count('/') #number of slashes in start—need to remove everything after third slash
slashList = [i for i, ind in enumerate(start) if ind == '/'] #list of indices of slashes
if (len(slashList) >= 3): #if there are 3 or more slashes, cut after 3
    third = slashList[2]
    base = start[:third] #base is everything up to third slash
else:
    base = start
br = mechanize.Browser()
r = br.open(start)
html = r.read()
linkList = [] #empty list of links

內容解密:

這段程式碼主要完成以下工作:

  1. 使用者輸入:提示使用者輸入起始網址和需要下載的檔案型別。
  2. 初始化變數:根據使用者輸入初始化必要的變數,如 base(基礎網址)和 linkList(連結列表)。
  3. 開啟網頁:使用 mechanize.Browser() 模擬瀏覽器開啟起始網址。

建立目錄與逐步下載

在這一部分,我們將介紹如何在程式碼中建立目錄並逐步下載檔案。首先,我們需要考慮如何從 URL 中提取目錄名稱並建立所需的目錄。以下是相關程式碼:

if not os.path.exists(directoryName):
    os.makedirs(directoryName)

內容解密:

這段程式碼主要完成以下工作:

  1. 目錄判斷:檢查指定的目錄是否存在。
  2. 建立目錄:如果目錄不存在,則使用 os.makedirs() 建立該目錄。

自動化與擴充套件

為了讓機器人更加智慧化和自動化,我們可以進一步擴充套件它的功能。例如,可以讓機器人自動追蹤多層連結,或者根據特定規則選擇性地下載檔案。以下是相關思考:

  • 多層連結追蹤:可以設定一個遞迴函式來追蹤多層連結。每次遇到新的 .html.htm 連結時,都可以重複執行下載過程。
  • 檔案選擇性下載:可以根據特定規則(如檔案大小、上傳時間等)選擇性地下載檔案。

收尾

玄貓認為,這個 Web 機器人只是一個簡單的範例。未來可以進一步擴充套件它的功能,如增加錯誤處理機制、最佳化效能、增加日誌記錄等。透過不斷改進和最佳化,這個機器人將能夠更好地服務於各種實際應用場景。

希望這篇文章能夠幫助你更好地理解如何開發一個 Web 機器人。如果你有任何問題或建議,歡迎留言討論。