9

部分的に機能している次のコードがあります。

class ThreadSpider(CrawlSpider):
    name = 'thread'
    allowed_domains = ['bbs.example.com']
    start_urls = ['http://bbs.example.com/diy']

    rules = (
        Rule(LinkExtractor(
            allow=(),
            restrict_xpaths=("//a[contains(text(), 'Next Page')]")
        ),
            callback='parse_item',
            process_request='start_requests',
            follow=True),
    )

def start_requests(self):
    for url in self.start_urls:
        yield SplashRequest(url, self.parse_item, args={'wait': 0.5})

def parse_item(self, response):
    # item parser

コードは に対してのみ実行されますが、でstart_urls指定されたリンクはたどりません。メソッドとルールの行をrestricted_xpathsコメントアウトすると、意図したとおりに実行され、もちろん js レンダリングなしでリンクがたどられます。start_requests()process_request='start_requests',

私は2つの関連する質問を読みました.CrawlSpider with Splashが最初のURLの後にスタックし、 CrawlSpider with Splashがメソッド内で具体的に変更さscrapy.Request()れましたが、うまくいかないようです. コードの何が問題になっていますか? ありがとう、SplashRequest()start_requests()

4

3 に答える 3

2

https://github.com/scrapy-plugins/scrapy-splash/issues/92に関連しているようです

個人的に私は dont_process_response=True を使用しているので、応答は HtmlResponse (_request_to_follows のコードで必要) です。

また、スパイダーで _build_request メソッドを次のように再定義します。

def _build_request(self, rule, link):
    r = SplashRequest(url=link.url, callback=self._response_downloaded, args={'wait': 0.5}, dont_process_response=True)
    r.meta.update(rule=rule, link_text=link.text)
    return r 

github の問題では、クラスで _request_to_follow メソッドを再定義するだけのユーザーもいます。

于 2018-03-24T14:46:41.953 に答える