此環節是在MAC OS中進行搭建
安裝scrapy
pip install scrapy即可快速完成安裝
創建項目:
$ scrapy startproject tutorial
輸出如下:
New Scrapy project 'tutorial', using template directory '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scrapy/templates/project', created in:
/Users/huilinwang/tutorial
You can start your first spider with:
cd tutorial
scrapy genspider example example.com
該目錄下結構如下:
tutorial/
? ? ?scrapy.cfg
? ? ?tutorial/
? ? ? ? ? __init__.py
? ? ? ? ?items.py
? ? ? ? ?pipelines.py
? ? ? ? ?settings.py
? ? ? ? ?spiders/
? ? ? ? ? ? ? ? __init__.py
? ? ? ? ? ? ? ? ?...
分解說明如下:
scrapy.cfg: 項目的配置文件
tutorial/: 該項目的python模塊。之后您將在此加入代碼。
tutorial/items.py: 項目中的item文件.
tutorial/pipelines.py: 項目中的pipelines文件.
tutorial/settings.py: 項目的設置文件.
tutorial/spiders/: 放置spider代碼的目錄.
定義item
Item 是保存爬取到的數據的容器;其使用方法和python字典類似, 并且提供了額外保護機制來避免拼寫錯誤導致的未定義字段錯誤。
根據需要從dmoz.org獲取到的數據對item進行建模。 我們需要從dmoz中獲取名字,url,以及網站的描述。 對此,在item中定義相應的字段。編輯 tutorial 目錄中的 items.py 文件:
import scrapy
class DmozItem(scrapy.Item):
? ? ? ?title = scrapy.Field()
? ? ? ?link = scrapy.Field()
? ? ? ?desc = scrapy.Field()
編寫第一個爬蟲(Spider)
Spider是用戶編寫用于從單個網站(或者一些網站)爬取數據的類。
其包含了一個用于下載的初始URL,如何跟進網頁中的鏈接以及如何分析頁面中的內容, 提取生成 item 的方法。
為了創建一個Spider,您必須繼承 scrapy.Spider 類, 且定義以下三個屬性:
name: 用于區別Spider。 該名字必須是唯一的,您不可以為不同的Spider設定相同的名字。
start_urls: 包含了Spider在啟動時進行爬取的url列表。 因此,第一個被獲取到的頁面將是其中之一。 后續的URL則從初始的URL獲取到的數據中提取。
parse() 是spider的一個方法。 被調用時,每個初始URL完成下載后生成的 Response 對象將會作為唯一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據(生成item)以及生成需要進一步處理的URL的 Request 對象。
以下為我們的第一個Spider代碼,保存在 tutorial/spiders 目錄下的 dmoz_spider.py 文件中:
import scrapy
class DmozSpider(scrapy.spiders.Spider):
? ? ?name = "dmoz"
? ? ?allowed_domains = ["dmoz.org"]
? ? ?start_urls = [
? ? ?"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
? ? ?"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
? ? ?]
? ? ?def parse(self, response):
? ? ? ? ?filename = response.url.split("/")[-2]
? ? ? ? ?with open(filename, 'wb') as f:
? ? ? ? ?f.write(response.body)
name屬性很重要,不同spider不能使用相同的name
start_urls是spider抓取網頁的起始點,可以包括多個url
parse方法是spider抓到一個網頁以后默認調用的callback,避免使用這個名字來定義自己的方法。
當spider拿到url的內容以后,會調用parse方法,并且傳遞一個response參數給它,response包含了抓到的網頁的內容,在parse方法里,你可以從抓到的網頁里面解析數據。上面的代碼只是簡單地把網頁內容保存到文件。
爬取
進入項目的根目錄,執行下列命令啟動spider:
scrapy crawl dmoz
有兩個包含url所對應的內容的文件被創建了: Book , Resources 。
Scrapy為Spider的 start_urls 屬性中的每個URL創建了 scrapy.Request 對象,并將 parse 方法作為回調函數(callback)賦值給了Request。
Request對象經過調度,執行生成 scrapy.http.Response 對象并送回給spider parse() 方法。
提取Item
從網頁中提取數據有很多方法。Scrapy使用了一種基于 XPath 和 CSS 表達式機制: Scrapy Selectors 。
Selector有四個基本的方法(點擊相應的方法可以看到詳細的API文檔):
xpath(): 傳入xpath表達式,返回該表達式所對應的所有節點的selector list列表 。
css(): 傳入CSS表達式,返回該表達式所對應的所有節點的selector list列表.
extract(): 序列化該節點為unicode字符串并返回list。
re(): 根據傳入的正則表達式對數據進行提取,返回unicode字符串list列表。
在Shell中嘗試Selector選擇器
進入項目的根目錄,執行下列命令來啟動shell:
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
當shell載入后,您將得到一個包含response數據的本地 response 變量。
輸入response.body將輸出response的包體,
輸出response.headers可以看到response的包頭。
更為重要的是,當輸入response.selector時, 您將獲取到一個可以用于查詢返回數據的selector(選擇器), 以及映射到response.selector.xpath() 、 response.selector.css()的 快捷方法(shortcut):response.xpath()和response.css()。
同時,shell根據response提前初始化了變量sel。該selector根據response的類型自動選擇最合適的分析規則(XML vs HTML)。
提取數據
嘗試從這些頁面中提取些有用的數據
在終端中輸入 response.body 來觀察HTML源碼并確定合適的XPath表達式。不過,這任務非常無聊且不易。您可以考慮使用Firefox的Firebug擴展來使得工作更為輕松。
查看了網頁的源碼后,您會發現網站的信息是被包含在 第二個
- 元素中。
我們可以通過這段代碼選擇該頁面中網站列表里所有
在我們的spider中加入這段代碼:
import scrapy
class DmozSpider(scrapy.Spider):
? ? ? ? ?name = "dmoz"
? ? ? ? ?allowed_domains = ["dmoz.org"]
? ? ? ? ?start_urls = [
? ? ? ? "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
? ? ? ? ?"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
? ? ? ? ?]
? ? ? ? ?def parse(self, response):
? ? ? ? ? ? ? for sel in response.xpath('//ul/li'):
? ? ? ? ? ? ? title = sel.xpath('a/text()').extract()
? ? ? ? ? ? ? link = sel.xpath('a/@href').extract()
? ? ? ? ? ? ? desc = sel.xpath('text()').extract()
? ? ? ? ? ? ? print title, link, desc
現在嘗試再次爬取dmoz.org,您將看到爬取到的網站信息被成功輸出
/ul/li表示選擇所有的ul標簽下的li標簽
a/@href表示選擇所有a標簽的href屬性
a/text()表示選擇a標簽文本
a[@href="abc"]表示選擇所有href屬性是abc的a標簽
保存爬取到的數據
最簡單存儲爬取的數據的方式是使用 Feed exports:
scrapy crawl dmoz -o items.json
該命令將采用 JSON 格式對爬取的數據進行序列化,生成 items.json 文件。