1. 程式人生 > >Scrapy——安裝及使用

Scrapy——安裝及使用

安裝

目前只支援python2

pip install Scrapy

升級Scrapy

pip install --upgrade Scrapy

UR²IM——基本抓取流程

和Scrapy打交道時,你所遵循得最通用的流程是UR²IM流程。 這裡寫圖片描述

建立專案

進入你想儲存專案的目錄

scrapy startproject tutorial
tutorial/
├── scrapy.cfg   #專案的配置檔案
└── tutorial    #專案的python檔案
    ├── __init__.py 
    ├── items.py #專案中的item檔案
├── middlewares.py ├── pipelines.py #pipelines檔案 ├── settings.py #設定檔案 └── spiders #防止spider程式碼的目錄 └── __init__.py

定義Item Item是儲存爬取到的資料的容器;其使用方法和python字典類似,並且提供額外保護機制來避免拼寫錯誤導致的為定義欄位錯誤。類似ORM中作的一樣。 首先根據需要從dmoz.org獲取到的資料對item進行建模,需要從dmoz中獲取名字,url以及網站的描述。 tutorial/items.py

class
DmozItem(scrapy.Item): title=scrapy.Field() link=scrapy.Field() desc=scrapy.Field()

編寫第一個爬蟲 Spider使使用者編寫用於從單個網站爬取的類。 其包含了一個用於下載的初始URL,如何跟進網頁中的連結以及如何分析頁面中的內容,提取生成的item的方法。 建立Spider

  • name:用於區別Spider,該名字唯一。
  • start_urls:包含了Spider在啟動時進行爬取的url列表。
  • parse()是spider得一個方法。被呼叫時,每個初始URL完成下載後生成的Response物件將會作為為以引數傳遞給該函式。該方法負責解析返回的資料,提取資料以及生成需要進一步處理的URL的Request物件。

tutorail/spiders.dmoz_spider.py

import scrapy


class DomzSpider(scrapy.Spider):

    name="dmoz"
    allowed_domains=["dmoz.org"]
    start_urls=[
        "http://exanple.com/"
    ]

    def parse(self, response):
        filename=response.url.split("/")[-2]
        with open(filename,'wb') as f:
            f.write(response.body)

並且生成url所對應的內容的檔案被建立。 原理:Scrapy為Spider的start_urls屬性中的每個URL建立了scrapy.Request物件,並將parse方法作為會掉函式故只給Request。 Request物件經排程,執行生成scrapy.http.Response物件並返回給spider.parse()方法。 Selectors選擇器簡介 從網頁中提取資料有很多種方法。Scrapy使用了一種基於XPath和CSS表達機制:Scrapy Selectors。 Selector有四種基本方法:

  • xpath():傳入xpath表示式,返回該表示式所對應的所有節點的selecor list 列表;
  • css():傳入CSS表示式,返回該表示式所對應的所有節點的selector list列表;
  • extract():序列化該節點為unicode字串並返回list;
  • re():根據傳入的正則表示式對資料進行提取,返回unicode字串list列表。 使用Selector選擇器 使用內建的Scrapy shell,需要已安裝好的IPython。
pip install ipython --user
scrapy shell "http://example1.com"

當shell載入之後,你將得到一個包含response的資料的本地response變數。輸入response.body將會得到response的包體,輸入response.head將會得到包頭。 輸入response.selector時,將獲取到一個可以用於查詢返回資料的selector選擇器。以及對映到 response.selector.xpath() 、 response.selector.css() 的 快捷方法(shortcut): response.xpath() 和 response.css() 。

In [2]: response.xpath('//title')
Out[2]: [<Selector xpath='//title' data=u'<title>Example 1</title>'>]

In [3]: response.xpath('//title').extract()
Out[3]: [u'<title>Example 1</title>']

In [4]: response.xpath('//title/text()')
Out[4]: [<Selector xpath='//title/text()' data=u'Example 1'>]

In [5]: response.xpath('//title/text()').extract()
Out[5]: [u'Example 1']
In [3]: response.xpath('//title').extract()
Out[3]: [u'<title>Example 1</title>']

In [4]: response.xpath('//title/text()')
Out[4]: [<Selector xpath='//title/text()' data=u'Example 1'>]

In [7]: response.xpath('//title/text()').re('(\w+)')
Out[7]: [u'Example', u'1']