как обновить ответ паука в скрапе - PullRequest
0 голосов
/ 18 ноября 2018

Я очень новичок в SCRAPY Я пытаюсь извлечь 100 цитат с этого сайта (http://quotes.toscrape.com/random),, чтобы сделать это, я пишу следующий паук

# -*- 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 с бесконечным циклом, это означает, что ответ не обновляется, потому что веб-сайт отображает новую цитату каждый раз, когда вы обновляете страницу, как обновить ответ функции разбора в каждом цикле. кто-нибудь может мне помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Как указал stranac, самый простой способ - использовать расширение close spider .

Ваша ответственность за паука должна заключаться только в создании элементов и запросов.

Другойпроблема в вашем коде [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

0 голосов
/ 19 ноября 2018

Вы не должны обрабатывать логику циклического подсчета в вашем методе 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 .
Настройка CLOSESPIDER_ITEMCOUNT или CLOSESPIDER_PAGECOUNT должна работать для вашего варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...