scrapy初試
創(chuàng)建項目
打開
cmd,在終端輸入scrapy startproject tutorial,這里將在指定的文件夾下創(chuàng)建一個scrapy工程
其中將會創(chuàng)建以下的文件:
scrapy.cfg: 項目的配置文件tutorial/: 該項目的python模塊。之后您將在此加入代碼。tutorial/items.py: 項目中的item文件.tutorial/pipelines.py: 項目中的pipelines文件.tutorial/settings.py: 項目的設置文件.tutorial/spiders/: 放置spider代碼的目錄.
定義item
Item是保存爬取到的數(shù)據(jù)的容器;其使用方法和python字典類似, 并且提供了額外保護機制來避免拼寫錯誤導致的未定義字段錯誤。
類似在
ORM中做的一樣,您可以通過創(chuàng)建一個scrapy.Item類, 并且定義類型為scrapy.Field的類屬性來定義一個Item。 (如果不了解ORM, 不用擔心,您會發(fā)現(xiàn)這個步驟非常簡單)
首先根據(jù)需要從
dmoz.org獲取到的數(shù)據(jù)對item進行建模。 我們需要從dmoz中獲取名字,url,以及網(wǎng)站的描述。 對此,在item中定義相應的字段。編輯tutorial目錄中的items.py文件:
import scrapy
class DmozItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()
一開始這看起來可能有點復雜,但是通過定義item, 您可以很方便的使用Scrapy的其他方法。而這些方法需要知道您的item的定義.
編寫第一個爬蟲
在工程的根目錄下打開終端輸入
scrapy genspider demo douban.com
這里的demo是spders文件下的主要py文件
douban.com是要爬取的域名,會在demo.py中的allowed_domains中顯示,主要的功能就是限制爬取的urlspider代碼中內(nèi)容解析
name: 用于區(qū)別Spider。 該名字必須是唯一的,您不可以為不同的Spider設定相同的名字。
start_urls: 包含了Spider在啟動時進行爬取的url列表。 因此,第一個被獲取到的頁面將是其中之一。 后續(xù)的URL則從初始的URL獲取到的數(shù)據(jù)中提取。parse()是spider的一個方法。 被調(diào)用時,每個初始URL完成下載后生成的 Response 對象將會作為唯一的參數(shù)傳遞給該函數(shù)。 該方法負責解析返回的數(shù)據(jù)(response data),提取數(shù)據(jù)(生成item)以及生成需要進一步處理的URL的Request對象。
以下是spider目錄下的demo.py的代碼
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):
filename = response.url.split("/")[-2]
with open(filename, 'wb') as f:
f.write(response.body)
spider的爬取
進入工程的根目錄下打開終端輸入:
scrapy crawl dmoz
spider中的數(shù)據(jù)存取
在工程的根目錄下打開終端輸入
scrapy crawl dmoz -o items.json
這里是將數(shù)據(jù)存儲到json文件中