Scrapy爬虫在解析函数中没有完成所有循环

时间:2012-12-19 05:18:15

标签: python screen-scraping scrapy

我的抓取工具中有此代码

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

我是根据documentation完成的,但它只适用于一个循环。 我的意思是我只能在登录屏幕上看到

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
  5. 我如何获得LOOP 1 LOOP2 LOOP1 LOOP2 AND so on

2 个答案:

答案 0 :(得分:5)

问题出现在你的循环中

for site in sites[:5]:

您多次在循环中请求1个相同的网址。

默认情况下,Scrapy会过滤相同的请求并忽略它们。

如果您想多次请求相同的网址,则需要设置 dont_filter=True

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

那么它应该重复3次

答案 1 :(得分:1)

我认为你没有进入Loop 2的原因是因为你已经对Request中的网址进行了硬编码。 Scrapy不会多次访问已访问过的URL。

尝试更改该网址并查看其效果。不要依赖于消息的顺序,因为Requests没有按顺序发生