Scrapy入門
1. 準備工作
只需要安裝 Scrapy 庫即可,我實用的是 Pycharm 軟件,安裝的話只需要在菜單setting/project/project interpreter中添加第三包,搜索 scrapy 即可進行安裝。
或簡單粗暴:
pip install scrapy
2. 準備工作
2.1 創建項目
創建一個 Scrapy 項目,項目文件可以直接實用 scrapy 命令生成:
scrapy startproject 文件名稱
這個命令在cmd命令中執行,如果提示權限問題,可以加 sudo 運行該命令。該命令可以直接執行,不管在那個路徑下,但是我還是建議放在非系統盤下的指定常用的文件下,便於日後的分類和管理。文件的結構如下:
2.2 簡單解釋所創文件的結構
- scrapy_test (項目的名字)
- items.py (Item的定義,定義爬取的數據結構)
- middlewares.py (Middlewares的定義,定義爬取時的中間件)
- pipelines.py (Pipelines的定義,定義數據管道)
- settings.py (配置文件)
- spiders (放置 Spider 的文件夾,裏面存放了 Spider 的實例)
3. 創建 Spider
Spider 是自己定義的類,Scrapy 用它來從網頁裏抓取內容,並解析抓取的結果。這個類提供的Spider類得繼承scrapy.Spider,還要定義Spider的名稱和起始的請求,以及怎樣處理爬取後的結果的方法。
使用命令創建(小技巧,直接用Pycharm打開剛纔所創建的項目,在下方的Terminal處執行命令):
scrapy genspider Spider名稱 網站域名
# scrapy genspider quotes.toscrape.com
執行後spiders文件夾下多了一個quotes.py,他就是剛剛創建的Spider,內容如下:
import scrapy
class QuotesSpider(scrapy.Spider):
# 項目名 唯一 用來區分不同的 Spider
name = 'quotes'
# 允許爬取的域名 如果初始或後續的請求鏈接不是這個域名下的,則請求鏈接會被過濾掉
allowed_domains = ['quotes.toscrape.com']
# 包含了 Spider 在啓動時爬取的url列表,初始請求是由它來定的
start_urls = ['http://quotes.toscrape.com/']
# 被調用時 start_url 裏面的鏈接構成的請求完成下載執行後,返回的響應就會被作爲唯一的參數傳遞給這個函數。
# 該方法負責解析返回的響應,提取數據或者進一步生成要處理的請求
def parse(self, response):
pass
裏面所涉及的變量都有註釋解釋。
4. 分析目標網頁和你所要爬取的內容
該網頁用的是書中給出的網址
url = 'http://quotes.toscrape.com/'
該網頁沒有任何的反爬限制,即使你不更換請求頭也可以進行源碼的爬取,如下是網頁的源碼:
如源碼所示,所要爬取的信息都封裝在 class=“quote” 的 span 標籤中,看其中具體的,我們所要提取便是 text,author,tag三個信息,源碼過於簡單,不再多的敘述…
5. 創建 Item
Item是保存爬取數據的容器,它的使用方法和字典類似。不過相比字典,Item多了額外的保護機制,可以避免拼寫錯誤或者定義字段錯誤。
創建Item需要繼承 scrapy.Item 類,並且定義類型爲 scrapy.Field 的字段。由上分析源碼得知爬取的內容有 text、author、tags。
定義Item:
6. 使用Item,重寫Spider中parse()方法
7. 構造請求,使用回調函數實現連續抓取
上面的操作只能實現對初始請求隊列的抓取,那麼下一頁的內容該如何抓取呢?分析網頁源碼:
可以看到,在網頁的最下端有 Next 按鈕,而它的源碼便是下一頁的網頁鏈接,便通過這個按鈕來構造下一個請求。
構造請求時要用到 scrapy.Request 。所需要傳遞兩個參數時 url 和 callback
- url:請求鏈接
- callback:回調函數。回調函數 指定了該回調函數的請求完成之後,獲取到響應後,引擎會將該響應作爲參數傳遞給這個回調函數。其進行解析生成下一個請求
由於下一頁的網頁結構和第一頁的相同,便可以接着使用 parse()函數進行解析,在 parse() 方法後追加如下代碼便可實現回調函數,爬蟲的循環,直至把該網站所有網頁爬取完:
next = response.xpath('//li[@class="next"]/a/@href').extract_first()
url = response.urljoin(next)
# 兩個參數 url 和 callback
# url : 請求鏈接
# callback : 回調函數 指定了該回調函數的請求完成之後,獲取到響應後,引擎會將該響應作爲參數傳遞給這個回調函數。其進行解析生成下一個請求
yield scrapy.Request(url=url,callback=self.parse)
8. 最終的 Spider
9. 運行整體架構
在下方的Terminal處執行命令:
scrapy crawl quotes
接下來就可看到運行的結果了(過長,只放兩張截圖):
10. 保存到文件
執行命令:
scrapy crawl -o quotes.json
# 保存爲 json 文件格式
'''
更多的文件格式
quotes.jsonline
quotes.csv
quotes.xml
quotes.pickle
quotes.marshal
ftp://user:[email protected]/path/to/quotes.csv
'''
11. 使用 Item Pipeline 進行數據的清洗
當然要將數據保存如數據庫當中也得在這個文件中進行方法的重寫。
'''
Item Pipeline 項目管道。當 Spider 中的Item對象生成後,會被自動送到 Item Pipeline 中進行處理
其作用:清理 HTML 數據;
驗證爬取數據,檢查爬取字段;
查重並丟棄重複的結果;
將爬取的結果保存到數據庫。
實現 process_item() 方法,兩個參數 item 和 spider (spider 實例)
'''
在 pipeline.py 中進行方法的重寫:
以上就是Scrapy框架,從項目的創建到數據的爬取清洗的整個流程。
繼續努力,加油!