Scrapy安裝
在Windows cmd中輸入命令:
pip install scrapy
就會自動下載安裝Scrapy。等待安裝完成就能使用。也可以在cmd中輸入以下命令,來查看是否安裝成功:
scrapy -h
這個命令將會列出可用的若干命令,主要包括:
startproject:創建一個新項目
genspider:根據模版生成一個新爬蟲
crawl:執行爬蟲
shell:啓動交互式抓取控制檯
方法
創建項目
必須創建一個新的Scrapy項目。具體方法:
進入打算存儲代碼的目錄中,運行以下命令:
scrapy startproject project_name
其中,project_name可以替換成任何其他名字,作爲項目的名稱。這裏,我們使用garnet作爲項目的名字,則上面的命令則會創建garnet目錄(文件夾),結構如下:
garnet/
scrapy.cfg
garnet/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
各文件的作用如下:
scrapy.cfg
項目的配置文件
garnet/
項目的python模塊,之後將在此加入新的代碼
garnet/items.py
項目中的item文件,該文件定義了待抓取域的模型
garnet/pipelines.py
項目中的pipelines文件,處理要抓取的域
garnet/settings.py
項目的設置文件,如用戶代理,爬取延時等
garnet/spiders/
放置spider代碼的目錄
定義模型(Item)
Item是保存爬取到的數據的容器。通過創建一個scrapy.Item
,並使用scrapy.Field
的類屬性,來定義一個Item。例如,我們需要從網站獲取標題和URL:
import scrapy
class GarnetItem(scrapy.Item):
url = scrapy.Field()
創建爬蟲
創建一個爬蟲,需要繼承scrapy.Spider
類
import scrapy
class GarnetSpider(scrapy.Spider):
name = 'pc426'
start_urls = ['http://www.pc426.com/']# 可以擁有多個起始URL,是一個list
allowed_domains = ['pc426.com']
def parse_item(self,response):
pass
其中:
name
定義爬蟲的名字,該名字必須是唯一的;
start_url
定義爬蟲起始的URL列表;
allowed_domains
定義了可爬取的域名列表,如果沒有定義該屬性,則表示可以爬取任何域名
parse_item()
是spider的一個方法,被調用時每個初始URL下載完後生成的response作爲參數傳遞給該函數。該方法負責解析返回的數據。
或者使用genspider命令:
scrapy genspider pc426 www.pc426.com --template=crawl
其中,pc426爲模版名。運行該命令後,與上面類似的代碼就會生成在garnet/spiders/pc426.py
中自動生成。
測試爬蟲
scrapy crawl pc426
則會啓動名爲pc426
的爬蟲。
過程:
1.Scrapy爲Spider的
start_urls
屬性中的每個URL創建了scrapy.Request
對象,並將parse_item
方法作爲回調函數(callback)賦值給了Request。
2.Request對象經過調度,執行生成scrapy.http.Response
對象並送回給spiderparse_item()
方法。
提取Item
Selectors選擇器
Scrapy使用了一種基於 XPath 和 CSS 表達式機制: Scrapy Selectors。
Selector有四個基本的方法:
xpath()
: 傳入xpath表達式,返回該表達式所對應的所有節點的selector list列表 。
css()
: 傳入CSS表達式,返回該表達式所對應的所有節點的selector list列表.
extract()
: 序列化該節點爲unicode字符串並返回list。
re()
: 根據傳入的正則表達式對數據進行提取,返回unicode字符串list列表。
在Shell中使用Selector選擇器
進入項目的根目錄,執行下列命令來啓動shell,將會進入IPython:
scrapy shell "http://www.pc426.com/"
shell輸出如下:
載入shell後,將會得到一個response
變量。輸入:
response.body
得到response的內容;
response.header
得到response的頭信息;
response.selector
得到一個可用於查詢返回數據的selector(選擇器)。
該選擇器包含的主要方法有:
response.xpath()
和response.css()
,等價於response.selector.xpath()
與response.selector.css()
。
使用item
Item對象是自定義的python字典。可以使用標準的字典語法來獲取到其每個字段的值(字段即是我們之前在items.py
用Field賦值的屬性)。
item = MyItem()
item['url'] = 'example string'
綜合
一般來說,Spider將會將爬取到的數據以 Item 對象返回。所以爲了將爬取的數據返回,我們最終的代碼將是(garnet/spiders/pc426.py
中的內容):
import scrapy
from garnet.items import GarnetItem
class Pc426Spider(scrapy.Spider):
name = 'pc426'
start_urls = ['http://www.pc426.com/']# 可以擁有多個起始URL,是一個list
allowed_domains = ['pc426.com']
def parse_item(self,response):
for sel in response.xpath('//ul/li/a/@href').extract():
item() = GarnetItem()
item['url'] = sel
保存爬取到的數據
scrapy crawl dmoz -o items.json
該命令將採用 JSON 格式對爬取的數據進行序列化,生成items.json
文件。