0

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)

助けてくれてありがとう。要約すると、問題は、これらの「次のページ」のリンクをたどる必要があるのに、リンクが壊れていることです。リンクを修正することはできますが、再度フォローする方法がわかりません。

4

1 に答える 1

1

必要なのは、抽出されたリンクから値を取得する関数を参照し、リンクがスパイダーによってクロールされる前にそれらの値を変更できるprocess_value引数SgmlLinkExtractor(このリンクを参照) だと思います。href

以下では、2 番目のルールがコールバックを定義しないように変更されているため、組み込みのクロール アンド パースをCrawlSpider使用して新しいリンクを見つけます。あなたのparse_followメソッドは、この非常に参照されている通常の関数に変更されますRule

def fix_url(url):
    marker1 = url.find("?") + 1
    marker2 = url.find("page")
    fixed_url = url[:marker1] + url[marker2:] + "&" + url[marker1:marker2 - 1]
    fixed_url = fixed_url.replace("+"," ")
    return fixed_url

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"]'),
                process_value=fix_url)),
    )

    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
于 2013-08-14T20:52:50.213 に答える