代码之家  ›  专栏  ›  技术社区  ›  ekka

如何更新scrapy中spider的响应

  •  1
  • ekka  · 技术社区  · 7 年前

    我试着从这个网站上摘录100条引文( http://quotes.toscrape.com/random ),为此,我编写了以下spider

    # -*- coding: utf-8 -*-
    import scrapy
    
    
    class QuotesProjectSpider(scrapy.Spider):
         name = 'quotes_project'
         allowed_domains = ['toscrape.com']
         start_urls = ['http://quotes.toscrape.com/random']
    
        def parse(self, response):
             self.log('i gonna scrape : '+response.url)
             #self.log('the whole page : '+response.text)
             i=1
             tempQuotes = {}
             quotesArray = [ {
                'author' : response.css('div.quote small.author::text')[0].extract(),
                'quote' : response.css('div.quote span.text::text')[0].extract(),
                'tags' : response.css('div.quote div.tags a.tag::text').extract()
            }]
             flag = False
             while i < 100:
                  tempQuotes =  {
                'author' : response.css('div.quote small.author::text')[0].extract(),
                'quote' : response.css('div.quote span.text::text')[0].extract(),
                'tags' : response.css('div.quote div.tags a.tag::text').extract()
            }
                  flag = False
                  j = 0
                  n = len(quotesArray)
                  while not flag and j < n :
                       if tempQuotes['quote'] == quotesArray[j]['quote'] :
                           flag = True
                       j+=1
                  if not flag :
                       quotesArray.append(tempQuotes)
                       i+=1
                  print("i = " + str(i))
                  print("quote : "+tempQuotes['quote'])
                  print("condition : " + str(tempQuotes['quote'] == quotesArray[0]['quote']))
    
        yield quotesArray
    

    print(“条件:”+str(tempQuotes['quote']==quotesArray[0]['quote']))

    它用一个无限循环向我展示了True,这意味着响应没有更新,因为每次刷新页面时网站都会显示一个新的引用,所以如何更新每个循环中parse函数的响应。 有人能帮我吗?

    2 回复  |  直到 7 年前
        1
  •  0
  •   stranac    7 年前

    你不应该在你的电脑里处理循环和计数逻辑 parse 方法。

    这将提取一个项目,然后重新加载页面。

    def parse(self, response):
        yield {
            'author': response.css('div.quote small.author::text').get(),
            'quote': response.css('div.quote span.text::text').get(),
            'tags': response.css('div.quote div.tags a.tag::text').getall(),
        }
    
        yield response.request
    

    为了阻止这种情况永远持续下去,你可以使用 Close spider extension .
    CLOSESPIDER_ITEMCOUNT CLOSESPIDER_PAGECOUNT 应该适合你的用例。

        2
  •  0
  •   Guillaume    7 年前

    close spider extension .

    [0].extract() ,您应该使用 .extract_first() 相反。

    myspider.py公司

    from scrapy.spiders import Spider
    
    class MySpider(Spider):
    
        name = 'toscrape.com'
    
        start_urls = ['http://quotes.toscrape.com/random']
    
        custom_settings = {
            'CLOSESPIDER_ITEMCOUNT': 100,
        }
    
        visited_quotes = set()
    
        def parse(self, response):
    
            quote = response.css('div.quote span.text::text').extract_first()
    
            if not quote in self.visited_quotes:
                self.visited_quotes.add(quote)
                yield {
                    'author' : response.css('div.quote small.author::text').extract_first(),
                    'quote' : quote,
                    'tags' : response.css('div.quote div.tags a.tag::text').extract()
                }
    
            yield response.request
    

    然后你跑:

    $ scrapy runspider myspider.py -o out.json

    推荐文章