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']