1

適切に機能しているように見えるスパイダーを作成しましたが、収集しているデータを保存する方法がわかりません。

スパイダーは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

しかし、これまでのところ何も機能していません。どこが間違っているのでしょうか?

アイデアや肯定的な批判は大歓迎です。

4

2 に答える 2

2

yield item少なくとも 1 つのコールバックで必要です。

于 2013-11-02T01:45:26.900 に答える
1

@bornytm -

self.addThreadNames 

URLまたは中間結果を渡す関数です。ファイル csv または json に保存する場合は、次のようにすることができます

yield "result"  ("result" can be replaced with your variable to which you are storing data. If you have multiple value , use yield in for loop. )

その後

scrapy crawl TheScienceForum.com -o output.csv -t csv

これはあなたを助けるでしょう

于 2015-01-09T10:43:52.907 に答える