引用
Scrapy 官方教程
一蒂阱,概述
Scrapy 是一個為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架亮蒋,可以使用于包括數(shù)據(jù)挖掘煮寡,信息處理和存儲歷史數(shù)據(jù)等一系列的程序中
最初是為了頁面抓取(網(wǎng)絡(luò)抓戎菏)所設(shè)計的蜡感,也可以應(yīng)用在獲取API所返回的數(shù)據(jù)或者通用的網(wǎng)絡(luò)爬蟲
二,入門指南
教程將完成下列任務(wù):
1沧竟,創(chuàng)建一個Scrapy
項目铸敏;
2,定義提取的Item
3悟泵,編寫爬取網(wǎng)站的spider
并且提取Item(即數(shù)據(jù))
4杈笔,編寫Item Pipeline
來存儲提取到的Item
1,安裝
Ubuntu
下糕非,pip install Scrapy
2蒙具,創(chuàng)建項目
在爬取之前球榆,需要創(chuàng)建一個新的Scrapy項目
scrapy startproject tutorial
產(chǎn)生的tutorial
目錄如下
文件功能:
scrapy.cfg
項目的配置文件
tutorial
項目的python 模塊,之后將在此目錄下添加代碼
tutorial/items.py
項目中的item文件
tutorial/pipelines.py
項目中的pipelines文件
tutorial/settings
項目中的設(shè)置文件
tutorial/spiders
放置spider代碼的目錄
3禁筏,定義Item
Item是保存爬取到的數(shù)據(jù)的容器持钉,使用方法和Python字典類似,并且提供了額外的保護機制來避免拼寫錯誤導(dǎo)致的未定義字段錯誤
類似在ORM中做的一樣篱昔,可以通過創(chuàng)建一個scrapy.Item
類每强,并且定義類型為scrapy.Field
的類
屬性來定義一個Item
首先根據(jù)需要從dmoz.org獲取到的數(shù)據(jù)對item進行建模
需要從dmoz中獲取名字,url州刽,和網(wǎng)站的描述
在item中定義相應(yīng)的字段空执,編輯tutorial
目錄中的items.py
文件
一開始看起來可能有些復(fù)雜,但是通過定義item, 可以很方便的使用Scrapy的其他方法穗椅,這些方法需要知道item的定義
3辨绊,編寫第一個Spider
Spider是用戶編寫的用于從單個網(wǎng)站或者一些網(wǎng)站爬取數(shù)據(jù)的類
包含了一個用于下載的初始URL,
如何跟進網(wǎng)頁中的鏈接和如何分析頁面中的內(nèi)容匹表,提取生成Item的方法
為了創(chuàng)建一個Spider,必須繼承scrapy.Spider類门坷,并且定義下面的三個屬性:
name
用于區(qū)別不同的Spider,該名字必須是唯一的
start_urls
包含了Spider在啟動時候進行爬取的url列表,因此袍镀,第一個被獲取到的頁面將是其中之一
后續(xù)的URL則從初始的URL獲取到的數(shù)據(jù)中提取
parse()
是spider的一個方法默蚌,被調(diào)用的時候,每個初始URL完成下載后生成的Reponse
對象將會作為唯一的參數(shù)傳遞給該函數(shù)流椒,該方法負(fù)責(zé)解析返回的數(shù)據(jù)response data
提取數(shù)據(jù)(生成item)和生成需要進一步處理的URL的Request
對象
上面是第一個Spider代碼敏簿,保存在tutorial/spiders
目錄下的dmoz_spider.py
文件中
3.1 爬取
進入項目tutorial
的根目錄明也,執(zhí)行命令啟動spider
scrapy crawl dmoz
宣虾, dmoz
來自類中的name
crawl dmoz 啟動用于爬取,得到兩個文件Books, Resources
Scrapy 為Spider的start_urls
屬性中的每個URL創(chuàng)建了一個scrapy.Request
對象温数,并且將
parse方法作為回調(diào)函數(shù)賦值給了Request
Request對象經(jīng)過調(diào)用绣硝,執(zhí)行生成scrapy.http.Response
對象并且送回給spider的parse()
方法
3.2 提取Item
Selectors 選擇器簡介
從網(wǎng)頁中提取數(shù)據(jù)有很多的方法,Scrapy 使用了一種基于Xpath和Css表達式機制-Scrapy Selectors
Xpath基本例子:
/html/head/title
選擇Html文檔中的head標(biāo)簽內(nèi)的title元素
/html/head/title/text()
選擇上面元素中的文字
//td
選擇所有的td元素
//div[@class="mini"]
選擇所有具有class="mine"
屬性的div元素
為了配合使用Xpath,Scrapy 提供了Selector之外撑刺,還提供了方法避免每次從response中提取數(shù)據(jù)時生成selector的麻煩
Selector有四個基本的方法
xpath()鹉胖,傳入xpath表達式,返回該表達式所對應(yīng)的所有節(jié)點的selector list列表
css()够傍, 出入css表達式,返回該表達式所對應(yīng)的所有節(jié)點的selector list
extract()甫菠,序列化該節(jié)點為unicode字符串并且返回list
re(),根據(jù)傳入的正則表達式對數(shù)據(jù)進行提取冕屯,返回unicode字符串列表