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

我按照文档做了,但它只适用于一个循环。我的意思是我只能在屏幕上看到登录

LOOP1
LOOP2

应该重复3次

我尝试了回报和收益的不同组合,所以

  1. return requestreturn item给出输出 LOOP1 LOOP2
  2. yield requestreturn item给出输出 LOOP1 LOOP1 LOOP1 LOOP2
  3. yield requestyield item给出输出 LOOP1 LOOP1 LOOP1 LOOP2
  4. return requestyield 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。

尝试更改该 URL,看看效果如何。不要依赖消息的顺序,因为 Requests没有按顺序发生

于 2012-12-20T06:07:12.253 回答