1。目前尚不支援python3, 所以中文顯示比較多一點手續
2。可以把抓網的邏輯放在一個目錄下。
3。抓下的data可以放在一個items.py裏集中管理
4。按spider裏取的名稱來執行
5。主要斷承自一種蜘蛛。
6。維護兩個地方,就可抓資料
7。另存檔案可很方便
稍微簡化一下昨晚的例子,(昨晚弄得太晚,思緒有點不清楚了。)
我想抓鐵人賽的自己發文的題目,及發文時間,那我觀察一下網址是,
http://ithelp.ithome.com.tw/ironman6/player/timloo/life/1
指定給start_urls 。
觀察一下文章題目的html原始檔,是**<h1 class="text_h1 subject"><a href="/question/10138342">財報分析心得分享之二十四:股價回不去及農夫播種術</a></h1>,而Scrapy是用XPath的語法來定位,而XPath,顧名思義有路徑的意思,
它是一種定位語言,當初委員會的人不知道是怎麼設想的,有一些特別符號,
如程式中的'//h1[@class="text_h1 subject"]/a/text()'**,
**//是一種簡寫的意思,[@ ]**是搜尋屬性的符號,
你可以回W3C去看原始規範的定義文件,可是要有靈感,才看得懂,
你可以看w3Schools的範例,馬上就有感覺了,
XPath利害的意地方,是可以找出含tag標籤文件(如html, xml)裏的所有文字,
from scrapy.spider import BaseSpider
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item
from ironman6.items import Ironman6Item
class IronManSpider(BaseSpider):
name = 'Ironman6'
allowed_domains = ['ithelp.ithome.com.tw']
start_urls = ['http://ithelp.ithome.com.tw/ironman6/player/timloo/life/1']
#rules = [Rule(SgmlLinkExtractor(allow=['/life/\d+']), 'parse_iron')]
def parse(self, response): #_iron
x = HtmlXPathSelector(response)
article = Ironman6Item()
article['subject'] = x.select('//h1[@class="text_h1 subject"]/a/text()').extract() #.encode('utf-8')
#article['summary'] = x.select("//p/text()").extract()
article['dwtime'] = x.select('//div[@class="text_dwtime"]/text()').extract() #.encode('utf-8')
for sj in article['subject'] :
print sj.encode('utf-8')
for tm in article['dwtime'] :
print tm.encode('utf-8')
return article
把文件裏的題目(subject)和發布時間(dwtime)兩個欄位宣告出來,
然後截取出來的data就可以放欄位裏。
from scrapy.item import Item, Field
class Ironman6Item(Item):
# define the fields for your item here like:
# name = Field()
#pass
subject = Field()
#summary = Field()
dwtime = Field()
輸出畫面:
timloo@timloo-home:~/iron/ironman6$ scrapy crawl Ironman6
2013-10-17 20:51:22+0800 [scrapy] INFO: Scrapy 0.18.4 started (bot: ironman6)
2013-10-17 20:51:22+0800 [scrapy] DEBUG: Optional features available: ssl, http11, libxml2
2013-10-17 20:51:22+0800 [scrapy] DEBUG: Overridden settings: {'NEWSPIDER_MODULE': 'ironman6.spiders', 'SPIDER_MODULES': ['ironman6.spiders'], 'BOT_NAME': 'ironman6'}
2013-10-17 20:51:22+0800 [scrapy] DEBUG: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
..................................................
2013-10-17 20:51:23+0800 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2013-10-17 20:51:23+0800 [scrapy] DEBUG: Enabled item pipelines:
2013-10-17 20:51:23+0800 [Ironman6] INFO: Spider opened
......................................................
2013-10-17 20:51:23+0800 [Ironman6] DEBUG: Crawled (200) <GET http://ithelp.ithome.com.tw/ironman6/player/timloo/life/1> (referer: None)
財報分析心得分享之二十四:股價回不去及農夫播種術
財報分析心得分享之二十三:本夢比的一個度量方式
財報分析心得分享之二十二:技術方析是統計學,並沒有為什麼
財報分析心得分享之二十一:程式異常時看看youtube轉換心情
財報分析心得分享之二十:配股配息這件事
財報分析心得分享之十九:HBO重播魔球(Money Ball)
財報分析心得分享之十八:DIY選股策略的考量
財報分析心得分享之十七:DIY選股策略
財報分析心得分享之十六:今天關於股神的消息
財報分析心得分享之十五:股價和獲利能力22時
前發表1天
前發表2天
前發表4天
前發表4天
前發表5天
前發表7天
前發表8天
前發表8天
前發表9天
前發表
.........................................................
如果要輸出csv檔,可以這樣下,
scrapy crawl Ironman6 -o test.csv -t csv
不過這個csv檔的格式,有點怪,
dwtime,subject
"
22時
前發表 ,
1天
前發表 ,
2天
前發表 ,
4天
前發表 ,
4天
前發表 ,
5天
前發表 ,
7天
前發表 ,
8天
前發表 ,
8天
前發表 ,
9天
前發表 ","財報分析心得分享之二十四:股價回不去及農夫播種術,財報分析心得分享之二十三:本夢比的一個度量方式,財報分析心得分享之二十二:技術方析是統計學,並沒有為什麼,財報分析心得分享之二十一:程式異常時看看youtube轉換心情,財報分析心得分享之二十:配股配息這件事,財報分析心得分享之十九:HBO重播魔球(Money Ball),財報分析心得分享之十八:DIY選股策略的考量,財報分析心得分享之十七:DIY選股策略,財報分析心得分享之十六:今天關於股神的消息,財報分析心得分享之十五:股價和獲利能力"
和筆者期待的格式不一樣。筆者主要是要寫到sqlite3為主,csv檔還好。
開始逐項來解釋:
2。4。spiders目錄裏統一放抓檔的蜘蛛。而每一只蜘蛛有一個名字
name = 'Ironman6'
,這名字只能唯一,因為
執行時,就是用這個名字,scrapy crawl Ironman6,所以名字要取好。
這個好處,以筆者的應用,可以把公開資訊觀測站的取名叫觀測站蜘蛛,証交所的資料抓取叫証交所蜘蛛,上櫃興櫃的網站叫上興櫃蜘蛛,方便管理。
3。抓下的data, 都是形如
from scrapy.item import Item, Field
class Ironman6Item(Item):
的類別,
如果沒有太奇怪的需求,統一放一起,要找的時候比較方便,
甚至可以把table資料表的create table sql也放這裏,集中管理。
5。蜘蛛有5大類,但最常用的有兩大類,
http://doc.scrapy.org/en/0.18/topics/spiders.html,
BaseSpider基本型,和CrawlSpider爬裏爬外型。
望文生義,CrawlSpider爬裏爬外型比較會爬,
要定義RULE,而筆者的需求,其實只要基本型即可。在start_urls LIST,把
要抓的超連結,抓同欄位的列舉出來即可。筆者的需求不是砍站,基本上,就是把超連結的年,月,股票代號這些變數換一換,這些固定格式的超連結的網頁裏的data抓回來即可。
6。上面的程式碼。
7。存檔案是方便,但格式還要查一下官方文件,目前格式不能讓EXCEL打開。