2 つのルールで CrawlSpider を使用しています。1 つのルールは、記事のリンクをページから取り出して送信し、CSV に保存します。もう 1 つは「次のページ」のリンクを見つけてたどります。
ただし、次のページのリンクは常に少しごちゃごちゃになっています。そのため、URL を修正し (これは可能です)、そのページをクロールして他のリンクを探す必要があります (方法はわかりません)。
私が読んだところによると、リクエストを作成する必要があるようですが、残念ながらこれがどのように機能するのかよくわかりません。要求は、指定されたページが他のすべてのページと同様にクロールされることを意味しますか? 私の CrawlSpider ルールは、そのページにあるリンクに引き続き適用されますか?
Request() を使用してみましたが、リンクをたどっていないようです。リンクを確認しましたが、問題なく動作します。そのページには、たどるべきリンクがあります。
コードは次のとおりです。
class MySpider(CrawlSpider):
name = 'ContentSpider'
allowed_domains = ['bbc.co.uk']
start_urls = ['http://www.bbc.co.uk/search/news/?q=credit card']
rules = (
Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@class="cmWidget news"]/div[@id="news-content"]'), allow=('http\:\/\/www\.bbc\.co\.uk\/news\/.')), callback='parse_item', follow=False),
Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@class="pagination"]'), allow=()), callback='parse_follow'),
)
def __init__(self, **kwargs):
CrawlSpider.__init__(self, **kwargs)
logfile = open('testlog.log', 'w')
log_observer = ScrapyFileLogObserver(logfile, level=logging.DEBUG)
log_observer.start()
log.start(loglevel=logging.DEBUG)
def parse_item(self, response):
item = CreditcrawlerItem()
item['url'] = response.url
return item
def parse_follow(self, response):
marker1 = response.url.find("?") + 1
marker2 = response.url.find("page")
fixed_url = response.url[:marker1] + response.url[marker2:] + "&" + response.url[marker1:marker2 - 1]
fixed_url = fixed_url.replace("+"," ")
return Request(fixed_url)
助けてくれてありがとう。要約すると、問題は、これらの「次のページ」のリンクをたどる必要があるのに、リンクが壊れていることです。リンクを修正することはできますが、再度フォローする方法がわかりません。