適切に機能しているように見えるスパイダーを作成しましたが、収集しているデータを保存する方法がわかりません。
スパイダーはTheScienceForumから開始し、メイン フォーラム ページを取得して、それぞれの項目を作成します。次に、個々のフォーラム ページをすべて調べて (アイテムを一緒に渡します)、各スレッドのタイトルを一致するフォーラム アイテムに追加します。コードは次のとおりです。
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.http import Request
from individualProject.items import ProjectItem
class TheScienceForum(BaseSpider):
name = "TheScienceForum.com"
allowed_domains = ["www.thescienceforum.com"]
start_urls = ["http://www.thescienceforum.com"]
def parse(self, response):
Sel = HtmlXPathSelector(response)
forumNames = Sel.select('//h2[@class="forumtitle"]/a/text()').extract()
items = []
for forumName in forumNames:
item = ProjectItem()
item['name'] = forumName
items.append(item)
forums = Sel.select('//h2[@class="forumtitle"]/a/@href').extract()
itemDict = {}
itemDict['items'] = items
for forum in forums:
yield Request(url=forum,meta=itemDict,callback=self.addThreadNames)
def addThreadNames(self, response):
items = response.meta['items']
Sel = HtmlXPathSelector(response)
currentForum = Sel.select('//h1/span[@class="forumtitle"]/text()').extract()
for item in items:
if currentForum==item['name']:
item['thread'] += Sel.select('//h3[@class="threadtitle"]/a/text()').extract()
self.log(items)
itemDict = {}
itemDict['items'] = items
threadPageNavs = Sel.select('//span[@class="prev_next"]/a[@rel="next"]/@href').extract()
for threadPageNav in threadPageNavs:
yield Request(url=threadPageNav,meta=itemDict,callback=self.addThreadNames)
オブジェクトを単純に返さないため (新しい要求のみが生成されます)、データがどこにも保持されないようです。次の JSON パイプラインを使用してみました。
class JsonWriterPipeline(object):
def __init__(self):
self.file = open('items.jl', 'wb')
def process_item(self, item, spider):
line = json.dumps(dict(item)) + "\n"
self.file.write(line)
return item
また、次のようにスパイダーを実行します。
scrapy crawl TheScienceForum.com -o items.json -t json
しかし、これまでのところ何も機能していません。どこが間違っているのでしょうか?
アイデアや肯定的な批判は大歓迎です。