天天看點

python基本網絡爬蟲代碼_想知道如何用python實作網絡爬蟲呢?爬取想獲得的一些資料,有沒有代碼架構?...

使用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。