使用Scrapy架構。
Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用架構。 Scrapy可以應用在包括資料挖掘,資訊處理或存儲曆史資料等一系列的程式中。
使用Scrapy開發一個基于Python的爬蟲非常簡單,開發者隻需要定制開發幾個子產品就可以輕松地實作一個爬蟲,用來抓取網頁資料。當然,要開發一個商業化的爬蟲,還需要大量的開發工作,這些工作包括爬蟲優化、爬取資料的存儲及清洗。
要使用Scrapy,需要先安裝Scrapy開發環境。因為Scrapy開發環境依賴一些外部庫,在安裝Scrapy之前,需要先安裝依賴庫。這裡給出Windows作業系統下Scrapy及依賴庫的安裝。
依賴庫lxml的安裝
lxml是python的一個解析庫,支援HTML和XML的解析,支援XPath解析方式,而且解析效率非常高。爬取的網頁内容需要使用lxml來解析。
在Windows指令行視窗輸入指令:
pip3 install pyOpenSSL
依賴庫pyOpenSSL的安裝
pyOpenSSL是Python一個支援資料安全的庫,當爬蟲爬取基于https協定的網站時,需要對請求資料進行加密,對爬取的資料也需要解密。
在Windows指令行視窗輸入指令:
pip3 install pyOpenSSL
依賴庫Twisted的安裝
Twisted是Python一個網絡程式設計庫,完成用戶端與服務端的通信,支援許多常見的傳輸及應用層協定,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。
使用pip3安裝Twisted庫可能會失敗,在這種情況下。可以在網上下載下傳Twisted庫的wheel檔案。wheel檔案是Python庫的安裝壓縮包,将Python庫對應的wheel檔案下載下傳到本地,再利用pip3來安裝Python庫。
Twisted庫對應的wheel檔案下載下傳位址是:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
Twisted庫提供了多個wheel檔案,對應不同的Python版本和作業系統。為找到正确的wheel檔案,需要在Windows指令行視窗輸入“python -V”指令,檢視目前Python的安裝版本。
下載下傳Twisted庫的網站提供了Python不同子產品的wheel檔案,内容非常豐富,要找到Twisted庫對應的wheel檔案,可以在網頁通過搜尋“Twisted”定位到下載下傳Twisted庫的頁面。
如上圖所示,下載下傳項中cp後面跟的數字代表該wheel檔案對應的Python版本,38表示對應的是Python3.8版本。下載下傳項中的win32表示對應32位Windows作業系統,win_amd64表示對應64位Windwos作業系統。
注意:下載下傳的wheel檔案名稱不要改動。
在Windows指令行視窗輸入指令:
pip3 install d:\python\Twisted-20.3.0-cp38-cp38-win_amd64.whl
指令中,install後面的内容是wheel檔案的路徑。
依賴庫PyWin32的安裝
PyWin32是Python一個封裝了Windows API的庫,使用該子產品,Python程式可以友善地調用Windows API執行系統級别的功能。
在Windows指令行視窗輸入指令:
pip3 install pyWin32
所有依賴庫都已安裝完成,現在可以安裝Scrapy庫了。
在Windows指令行視窗輸入指令:
pip3 install Scrapy
建構爬取百度熱點新聞的項目
學習爬蟲開發的最好方法就是先有一個案例,然後由案例入手,抽絲剝繭,逐漸掌握爬蟲技術的精髓。
下面使用Scrapy架構建立一個爬取百度熱點新聞的案例,建立案例程式需要五個步驟:
(1) 使用Scrapy建立一個爬蟲項目;
(2) 定義一個存儲爬取資料的容器;
(3) 配置項目檔案settings.py;
(4) 建立爬蟲,編寫代碼;
(5) 運作爬蟲程式。
使用Scrapy建立一個爬蟲項目
在Windows指令行視窗,将存儲項目檔案的目錄設定為目前目錄,使用scrapy指令建立爬蟲項目stock,項目名稱可以是其它名稱。
scrapy startproject stock
其中,scrapy是Scrapy架構提供的指令行程式,startproject是指令行程式的參數,該參數會建立一個新的爬蟲項目,stock是項目名稱。
該指令執行後,會在指令行視窗目前目錄下建立stock目錄,在stock目錄存儲了爬蟲項目的相關檔案。項目檔案結構如下圖所示:
※ spiders目錄用于存儲編寫的爬蟲業務邏輯代碼;
※ item.py用于定義爬取資料的容器,item.py定義了一個類,該類可以定義要爬取資料的字段名稱;
※ settings.py是項目的配置檔案,用于設定項目的基礎參數。如爬取資料的時間間隔、爬取時是否遵循 Robot 協定等;
※ pipelines.py用于對爬取的資料做進一步處理,如輸出到json檔案、mysql資料庫等;
※ middlewares.py用于在scrapy爬取資料的流程中,開發者可以添加一些自定義的中間件,進而開發出适應不同情況的爬蟲。
配置settings.py檔案
settings.py是項目的配置檔案,用于設定項目的基礎參數。該配置檔案可根據項目的需求随時更改配置項。
(1) 修改ROBOTSTXT_OBEY配置項
ROBOTSTXT_OBEY配置項用于配置爬蟲是否遵循Robot 協定。在網站的根目錄一般有 robots.txt 檔案,該檔案給出了允許爬蟲爬取網頁的範圍,将該項設定為False,爬蟲可以不受robots.txt 檔案的限制。
ROBOTSTXT_OBEY = False
定義item容器
爬蟲需要把爬取的資料存儲到一個資料結構,item容器用來定義這樣的資料結構。爬取網頁之前,需要分析爬取網頁的資料構成,在item.py檔案定義與其對應的資料結構。
檔案代碼:
# 導入scrapy庫
import scrapy
#自定義StockItem,用于存儲爬蟲所抓取的字段内容
class StockItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 新聞标題
news_title = scrapy.Field()
# 新聞連結
news_link = scrapy.Field()
代碼定義了news_title、news_link 資料字段,news_title存儲百度熱點新聞的标題,news_link存儲百度熱點新聞的超連結,這些資料字段的類型是Field類。
建立爬蟲,編寫代碼
爬蟲代碼的入口檔案由scrapy指令建立,進入Windows指令行視窗,把項目目錄設定為目前工作目錄,輸入下面的指令建立爬蟲入口檔案。
scrapy genspider spider_stockstar news.baidu.com
scrapy指令的genspider參數是建立一個爬蟲,spider_stockstar是爬蟲的名稱,爬蟲名稱可以選擇其它名稱,http://news.baidu.com是要爬取網頁路徑,也就是起始URL,也可以是其它網頁路徑。
指令執行完成後,scrapy會在項目的spiders目錄下建立spider_stockstar.py檔案。
檔案代碼如下:
import scrapy
class SpiderStockstarSpider(scrapy.Spider):
name = 'spider_stockstar'
allowed_domains = [' news.baidu.com ']
start_urls = [' https://news.baidu.com/ ']
def parse(self, response):
pass
allowed_domains定義爬蟲爬取的範圍,爬取範圍被限定在http://news.baidu.com域名下,start_urls定義爬蟲要爬取的起始網頁,案例中起始網頁的内容是百度新聞的首頁。
parse是網頁内容解析函數,需要自己編寫解析代碼。
import scrapy
# 導入scrapy選擇器
from scrapy.selector import Selector
# 導入StockItem
from stock.items import StockItem
class SpiderStockstarSpider(scrapy.Spider):
name = 'spider_stockstar'
allowed_domains = ['news.baidu.com']
start_urls = ['https://news.baidu.com/']
def parse(self, response):
# 爬取下來的HTML代碼
html = response.text
# 使用xpath表達式搜尋指定的a标簽節點,節點以清單方式傳回
item_nodes = response.xpath("//div[@class='hotnews']/ul/li/strong/a").extract()
# 周遊節點
for item_node in item_nodes:
# 使用xpath表達式擷取節點的href屬性值
a_href = Selector(text=str(item_node)).xpath('//@href').extract()
# 使用xpath表達式擷取節點的文本内容
a_text = Selector(text=str(item_node)).xpath('//text()').extract()
item = StockItem()
item["news_title"] = a_text
item["news_link"] = a_href
# 使用yield語句傳回item給parse的調用者
yield item
運作爬蟲程式
在項目的stock目錄下,建立main.py檔案,用于運作爬蟲。
檔案代碼如下:
from scrapy.cmdline import execute
execute(["scrapy","crawl","spider_stockstar","-o","items.json"])
scrapy 的execute函數用于在Python程式啟動spider_stockstar爬蟲,并将爬取的資料存儲到items.json檔案。函數的執行類似于在Windows指令行視窗執行下面的指令:
scrapy crawl spider_stockstar -o items.json
爬蟲運作後,爬蟲會把爬取的内容以JSON資料格式存儲到項目的stock目錄,JSON檔案名稱為items.json。