私はScrapyを使用して非常に単純なクローラーをコーディングすることができましたが、次のような制約があります。
- すべてのリンク情報(例:アンカーテキスト、ページタイトル)を保存するため、2つのコールバック
- CrawlSpiderを使用してルールを利用するため、BaseSpiderは使用できません
最初のリクエストにコールバックを追加した場合にルールが実装されないことを除いて、正常に動作します。
これが私のコードです:(実際の例では、正しくは機能しませんが)
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
from scrapySpider.items import SPage
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
class TestSpider4(CrawlSpider):
name = "spiderSO"
allowed_domains = ["cumulodata.com"]
start_urls = ["http://www.cumulodata.com"]
extractor = SgmlLinkExtractor()
def parse_start_url(self, response):
#3
print('----------manual call of',response)
self.parse_links(response)
print('----------manual call done')
# 1 return Request(self.start_urls[0]) # does not call parse_links(example.com)
# 2 return Request(self.start_urls[0],callback = self.parse_links) # does not call parse_links(example.com)
rules = (
Rule(extractor,callback='parse_links',follow=True),
)
def parse_links(self, response):
hxs = HtmlXPathSelector(response)
print('----------- manual parsing links of',response.url)
links = hxs.select('//a')
for link in links:
title = link.select('@title')
url = link.select('@href').extract()[0]
meta={'title':title,}
yield Request(url, callback = self.parse_page,meta=meta)
def parse_page(self, response):
print('----------- parsing page: ',response.url)
hxs = HtmlXPathSelector(response)
item=SPage()
item['url'] = str(response.request.url)
item['title']=response.meta['title']
item['h1']=hxs.select('//h1/text()').extract()
yield item
私はこの問題を3つの方法で解決しようとしました:
- 1:開始URLを含むリクエストを返すには-ルールは実行されません
- 2:上記と同じですが、コールバックがあります
parse_links
-同じ問題 - 3:開始URLをスクレイピングした
parse_links
後にparse_start_url
呼び出す、実装することにより、関数は呼び出されません
ログは次のとおりです。
----------manual call of <200 http://www.cumulodata.com>)
----------manual call done
#No '----------- manual parsing links', so `parse_links` is never called!
バージョン
- Python 2.7.2
- Scrapy 0.14.4