結果のオブジェクトを返すスクレイピーを使用して、特に目的のウェブクローラーを作成しようとしています。私は立ち往生しており、おそらく完全に逆方向に進んでいます。
より具体的には、TheScienceForum.com の各サブフォーラム(数学、物理学など) について、各サブフォーラム内のすべてのスレッドのタイトルを取得し、最終的にフォーラムの名前とフォーラム内のスレッドのすべてのタイトルのリスト。
最終的な目標は、スレッド タイトルのテキスト分析を行い、各フォーラムに関連する最も一般的な用語/専門用語を特定することです。最終的には、スレッド自体の分析も行いたいと考えています。
次のように定義された 1 つのクラス Item があります。
from scrapy.item import Item, Field
class ProjectItem(Item):
name = Field() #the forum name
titles = Field() #the titles
アイテムの仕組みを誤解しているかもしれませんが、サブフォーラムごとに 1 つのアイテムを作成し、そのサブフォーラムのすべてのスレッド タイトルを同じアイテムのリストにまとめたいと考えています。
私が作成したクローラーは次のように見えますが、期待どおりに機能しません。
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from individualProject.items import ProjectItem
class TheScienceForum(CrawlSpider):
name = "TheScienceForum.com"
allowed_domains = ["theScienceForum.com"]
start_urls = ["http://www.thescienceforum.com"]
rules = [Rule(SgmlLinkExtractor(restrict_xpaths=['//h2[@class="forumtitle"]/a']), 'parse_one'),Rule(SgmlLinkExtractor(restrict_xpaths=['//div[@class="threadpagenav"]']), 'parse_two')]
def parse_one(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)
yield items
def parse_two(self, response):
Sel = HtmlXPathSelector(response)
threadNames = Sel.select('////h3[@class="threadtitle"]/a/text()').extract()
for item in items:
for title in titles:
if Sel.select('//h1/span[@class="forumtitle"]/text()').extract()==item.name:
item['titles'] += Sel.select('//h3[@class="threadtitle"]/a/text()').extract()
return items
アイデアは、すべてのサブフォーラム名があるサイトのメイン ページから開始することです。最初のルールは、最初のサブフォーラム ページへのリンクとそれに関連付けられた解析機能のみを許可します。これは、サブフォーラムごとにアイテムを作成し、'name' 属性にフォーラム名をサブビングすることを意味します。
次のリクエストでは、2 番目のルールを使用して、スパイダーはサブ フォーラムのすべてのスレッド (ページ分割されたリンク) を含むページの移動に制限されます。2 番目の解析メソッドは、現在のサブフォーラムの名前 (Sel.select('//h1/span[@class="forumtitle"]/ text()').extract())
スパイダーはすべてのメイン フォーラム ページをクロールしていますが、各ページで次のエラーが発生しています。
2013-11-01 13:05:37-0400 [TheScienceForum.com] ERROR: Spider must return Request, BaseItem or None, got 'list' in <GET http://www.thescienceforum.com/mathematics/>
ヘルプやアドバイスをいただければ幸いです。ありがとう!