scrapy作為一個用python編寫的網絡爬蟲,繼承了python簡單易用的特點,目前已經在很多項目中所使用。
這里也是因為工作中的需要,把scrapy使用過程中的一些心得和遇到的問題記錄下來以便加深記憶。
scrapy安裝的過程就不在這里詳述了,大家安裝都會碰到各種不同的問題,主要還是因為python版本,vc++版本以及scrapy版本的兼容性引起的。
這里也附上我的安裝及運行環境:windows7+python2.6+Microsoft Visual Studio 2010+scrapy 0.18
最好不要用最新scrapy版本,在一些包的依賴上會報錯,導致各種各樣稀奇古怪的錯誤。
?
一個簡單的scrapy項目很簡單,會生成4個文件和一個文件夾,scrapy爬蟲就是圍繞這些文件進行工作,把最主要的過程自行封裝好了。(如下圖)

實際的目錄結構如下:
scrapy.cfg
myproject/__init__.pyitems.pypipelines.pysettings.pyspiders/__init__.pyspider1.pyspider2.py...
?
?
scrapy.cfg:爬蟲項目的注冊文件,不可修改。
?
items.py:用于定義蜘蛛爬行的信息分類,比如標題、正文、描述等。
items.py文件很重要,類似mvc模型中的m,用于定義最終接收的數據類型,也就是需要的數據信息。
?
一個典型的items.py文件信息如下:
from scrapy.item import Item, Fieldclass Website(Item):title = Field()description = Field()urls = Field()
?
這里就定義了一個典型的item類Website,用于接收爬蟲爬下來的信息,進行第二步處理。
?
Pipeline.py:scrapy的管道文件,用于對抓取信息進行關鍵詞或規則的抽取及過濾。舉個例子,你現在需要抓取一類熱點概念如“上海自貿區”相關的股票信息,
這部分信息在個股的描述字段里面有記錄,但你抓取的頁面上并沒有單獨將“上海自貿區”的類別獨立出來,而你想要這部分的信息,那么你可以在Pipeline文件中進行定義,讓蜘蛛在抓取信息后再經過一次過濾,這個過程有點類似水經過管道的過程,所以中文翻譯將Pipeline.py定義為管道文件。
?
一個典型的Pipeline.py文件內容如下:
from scrapy.exceptions import DropItemclass FilterWordsPipeline(object):"""A pipeline for filtering out items which contain certain words in theirdescription"""# put all words in lowercasewords_to_filter = ['上海自貿區']def process_item(self, item, spider):for word in self.words_to_filter:if word not in unicode(item['description']).lower():raise DropItem("Contains forbidden word: %s" % word)else:return item
?
settings.py:scrapy項目的全局設置文件。
看名字就知道,這個文件用來設置一些全局的參數,對蜘蛛爬蟲的行為進行控制,可以說是最核心的文件。
一些典型的settings參數設置如下:
SPIDER_MODULES 蜘蛛模塊所在的目錄,默認位于項目名/spidersDOWNLOAD_DELAY 蜘蛛爬取頁面的時間間隔,這個參數很重要,一般設置為0.5-1秒,太頻繁會被對方網站封IPUSER_AGENT 用戶代理信息,用來定義訪問目標網站頭部的user-agent信息BOT_NAME 蜘蛛爬蟲名,默認為"scrapybot",出現在headers頭部信息中CONCURRENT_ITEMS 爬蟲一次可識別的對象信息個數,默認為100CONCURRENT_REQUESTS 爬蟲可同時響應的請求個數,默認為16CONCURRENT_REQUESTS_PER_DOMAIN 針對單個域名爬蟲一次可同時響應的請求個數,默認為8DEFAULT_REQUEST_HEADERS 可定義爬蟲的頭部信息,用于偽裝成用戶進程DOWNLOAD_TIMEOUT 設置蜘蛛爬行的超時時間ITEM_PIPELINES 定義蜘蛛爬蟲的管道信息LOG_ENABLED 是否允許日志記錄LOG_ENCODING 日志編碼
?
spiders:用于定義各種各樣的蜘蛛文件,每個蜘蛛里面定義了其爬行網站獲取信息的規則,也就是說從某個網站上以什么樣的方式獲取何種類型的數據都在這里面進行定義。
?
一個簡單的spiders.py文件內容如下:
from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.http import Request
from myproject.items import MyItemclass MySpider(BaseSpider):name = 'example.com'allowed_domains = ['example.com']start_urls = ['http://www.example.com/1.html','http://www.example.com/2.html','http://www.example.com/3.html',]def parse(self, response):hxs = HtmlXPathSelector(response)for h3 in hxs.select('//h3').extract():yield MyItem(title=h3)for url in hxs.select('//a/@href').extract():yield Request(url, callback=self.parse)
?
其中name為蜘蛛名詞,allowed_domains為爬行的域名,start_urls為爬行的url列表,parse為解析的過程。
?
對于scrapy來說,一共有幾大類型的蜘蛛,分別如下:
?
BaseSpider: 基礎的爬蟲類,可以說是通用的,可自行在里面重構其解析函數。
?
CrawlSpider:典型的爬蟲蜘蛛類,可對大部分通用的網站進行爬行。
?
XMLFeedSpider:XML專門的爬蟲類
?
CSVFeedSpider:適用于CSV頁面的爬蟲類
?
SitemapSpider:適用于sitemap的爬蟲類