2

クローラーにこのコードがあります

class StackSpider(InitSpider):
    name = 'stack'
    allowed_domains = ['sitepoint.com']
    start_urls = ["http://www.sitepoint.com"]
    start_page = "http://www.sitepoint.com"
    item = StackItem()

    def init_request(self):

        return Request(url=self.start_page, callback=self.parse)

    def parse(self, response):

        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//div[@class="headline_area"]')
        items = []


        ivar = 1
        for site in sites[:5]:
            item = StackItem()
            log.msg(' LOOP' +str(ivar)+ '', level=log.ERROR)
            item['title'] ="yoo ma"
            request =  Request("http://www.sitepoint.com/getting-to-know-css3-selectors-structural-pseudo-classes/",  callback=self.test1)
            request.meta['item'] = item
            ivar = ivar + 1
            yield request


    def test1(self, response):
        log.msg('  LOOP 2 \n', level=log.ERROR)
        item = response.meta['item']
        item['desc'] = "test4"
        return item

ドキュメントに従って実行しましたが、1 つのループでしか機能しません。つまり、ログイン画面でしか見ることができません

LOOP1
LOOP2

3回繰り返せばいい

return と yield の別の組み合わせを試したので、

  1. return request そしてreturn item出力を与える LOOP1 LOOP2
  2. yield requestそしてreturn item出力を与える LOOP1 LOOP1 LOOP1 LOOP2
  3. yield requestそしてyield item出力を与える LOOP1 LOOP1 LOOP1 LOOP2
  4. return requestそしてyield item出力を与える LOOP1 LOOP2

どうすれば入手することができますかLOOP 1 LOOP2 LOOP1 LOOP2 AND so on

4

2 に答える 2

5

問題はあなたのループにあります

for site in sites[:5]:

ループ内の1つの同じURLを複数回要求しています。

Scrapyはデフォルトで同じリクエストをフィルタリングし、無視します。

同じURLで複数回リクエストする場合は、設定する必要がありますdont_filter=True

            request = Request("http://www.sitepoint.com/getting-to-know-css3-selectors-structural-pseudo-classes/",
            dont_filter=True,
            callback=self.test1)

その後、3回繰り返す必要があります

于 2012-12-20T10:07:57.497 に答える
1

Loop 2あなたがアクセスできない理由は、Request. Scrapy は、既に訪問した URL を 2 回以上訪問しません。

その URL を変更してみて、どうなるか見てみましょう。メッセージの順序に依存しないでください。順序通りに Requestsは発生しません。

于 2012-12-20T06:07:12.253 に答える