Scrapy 學習

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文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章