iT邦幫忙

DAY 21
6

用python擷取網頁上的開放資訊(數據資料),分析及畫出圖表系列 第 21

Scrapy(二):實作上的一些議題討論

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打開。


上一篇
Scrapy(一):python語言在爬網界的標準
下一篇
Scrapy(三):學XPATH的好工具:Scrapy Shell及將爬得的資料寫回SQLITE3
系列文
用python擷取網頁上的開放資訊(數據資料),分析及畫出圖表22

1 則留言

我要留言

立即登入留言