Невозможно сканировать несколько страниц - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь сканировать цитаты, имена авторов и теги из goodreads . Я могу сканировать одну страницу со следующим кодом

import scrapy 


class goodReadsSpider(scrapy.Spider):
#identity
name='goodreads'

#requests
def start_requests(self):
    url = 'https://www.goodreads.com/quotes?page=1'
    yield scrapy.Request(url=url,callback=self.parse)


#reponse
def parse(self,response):
   for quote in response.selector.xpath('//div[@class="quote"]'):
    yield{
        'text':quote.xpath('.//div[@class = "quoteText"]/text()[1]').extract(),
        'author':quote.xpath('.//span[@class = "authorOrTitle"]').extract_first(),
        'tags':quote.xpath('.//div[@class="greyText smallText left"]/a/text()').extract()
    }

но когда я пытаюсь ползти того же паука с добавлением следующего кода

 next_page = response.selector.xpath('//a[@class = "next_page"/@href').extract()



 if next_page is not None:
           next_page_link = response.urljoin(next_page)
           yield scrapy.request(url=next_page_link, callback=self.parse)

Я получаю следующую ошибку.

2019-05-29 10:47:14 [scrapy.core.engine] ИНФОРМАЦИЯ: Паук открыт
2019-05-29 10:47:14 [scrapy.extensions.logstats] ИНФОРМАЦИЯ: Просканировано 0 страниц (при 0 стр / мин), соскоб 0 штук (при 0 ед / мин) 2019-05-29 10:47:14 [scrapy.extensions.telnet] ИНФОРМАЦИЯ: Консоль Telnet прослушивает 127.0.0.1:6023 2019-05-29 10:47:15 [scrapy.core.engine] ОТЛАДКА: Сканировано (200) https://www.goodreads.com/robots.txt> (реферер: Нет) 2019-05-29 10:47:16 [scrapy.core.engine] ОТЛАДКА: Сканировано (200) https://www.goodreads.com/quotes?page=1> (рефери: нет)
2019-05-29 10:47:16 [scrapy.core.scraper] ОТЛАДКА: Соскоб с <200 <a href="https://www.goodreads.com/quotes?page=1" rel="nofollow noreferrer">https://www.goodreads.com/quotes?page=1> {'text': ["\ n« Не плачь, потому что все кончено, улыбнись, потому что это случилось. ”\ n"], 'author': '\ n Dr. Seuss \ n', 'tags': [«приписано-нет-источник», «плач», «плач», «опыт», «счастье», «радость», «жизнь», «неправильно назначенный-доктор-Сьюз», «оптимизм», «грусть», 'улыбка', 'улыбка']} 2019-05-29 10:47:16 [scrapy.core.scraper] ОШИБКА: обработка ошибки Spider https://www.goodreads.com/quotes?page=1> (реферер: нет) (последний вызов последний): файл "c: \ programdata \ anaconda3 \ lib \ site-packages \ parsel \ selector.py", строка 238, в xpath
** kwargs) Файл "src / lxml / etree.pyx", строка 1586, в файле lxml.etree._Element.xpath "src / lxml / xpath.pxi", строка 307, в lxml.etree.XPathElementEvaluator. call File «src / lxml / xpath.pxi», строка 227, в lxml.etree._XPathEvaluatorBase._handle_result
lxml.etree.XPathEvalError: Неверный предикат

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): File "C: \ ProgramData \ anaconda3 \ Lib \ сайт-пакеты \ SCRAPY \ Utils \ defer.py", строка 102, в iter_errback
yield next (it) Файл "c: \ programdata \ anaconda3 \ lib \ site-packages \ scrapy \ spidermiddlewares \ offsite.py", строка 29, в process_spider_output
для x в результате: файл "c: \ programdata \ anaconda3 \ lib \ site-packages \ scrapy \ spidermiddlewares \ referer.py", строка 339, в
return (_set_referer (r) для r в результате или ()) Файл "c: \ programdata \ anaconda3 \ lib \ site-packages \ scrapy \ spidermiddlewares \ urllength.py", строка 37, в
return (r для r в результате или () если _filter (r)) файл "c: \ programdata \ anaconda3 \ lib \ site-packages \ scrapy \ spidermiddlewares \ deep.py", строка 58, в
вернуть (r для r в результате или () если _filter (r)) файл "C: \ Users \ Zona \ Documents \ Visual \ demo_project \ demo_project \ spiders \ goodreads.py", строка 23, в разборе
next_page = response.selector.xpath ('// a [@class = "next_page" / @ href'). extract () Файл "c: \ programdata \ anaconda3 \ lib \ site-packages \ parsel \ selector.py", строка 242, в xpath
six.reraise (ValueError, ValueError (msg), sys.exc_info () [2]) Файл "c: \ programdata \ anaconda3 \ lib \ site-packages \ six.py", строка 692, в ререйз
повысить значение.with_traceback (tb) Файл "c: \ programdata \ anaconda3 \ lib \ site-packages \ parsel \ selector.py", строка 238, в xpath
** kwargs) Файл "src / lxml / etree.pyx", строка 1586, в файле lxml.etree._Element.xpath "src / lxml / xpath.pxi", строка 307, в lxml.etree.XPathElementEvaluator. call File «src / lxml / xpath.pxi», строка 227, в lxml.etree._XPathEvaluatorBase._handle_result ValueError: XPath ошибка: неверный предикат в // a [@class = "next_page" / @ href
2019-05-29 10:47:16 [scrapy.core.engine] ИНФОРМАЦИЯ: Закрытие паука (закончено) 2019-05-29 10:47:16 [scrapy.statscollectors] ИНФОРМАЦИЯ: Статистика Dumping Scrapy: {'загрузчик / request_bytes': 621,
'downloader / request_count': 2,
'downloader / request_method_count / GET': 2,
d»ownloader / response_bytes ': 29812,' downloader / response_count ': 2,' downloader / response_status_count / 200 ': 2,' finish_reason ':' finish ',' finish_time ': datetime.datetime (2019, 5, 29, 5, 47, 16, 767370), 'item_scraped_count': 1, 'log_count / DEBUG': 3,
'log_count / ERROR': 1, 'log_count / INFO': 9,
'response_received_count': 2, 'robotstxt/ request_count ': 1,
' robotstxt / response_count ': 1,
' robotstxt / response_status_count / 200 ': 1,' планировщик / удаленный доступ ': 1,' планировщик / удаленный доступ / память ': 1,' планировщик/ enqueued ': 1,
' планировщик / enqueued / memory ': 1,' spider_exceptions / ValueError ': 1,' start_time ': datetime.datetime (2019, 5, 29, 5, 47, 14, 108786)}
2019-05-29 10:47:16 [scrapy.core.engine] ИНФОРМАЦИЯ: Паук закрыт (закончен)

Я не уверен, что проблема с xpath, потому что в первой попыткеЯ получаю

'item_scraped_count': 30

, но здесь это 1, что означает, что паук не сканирует даже первую страницу.

1 Ответ

1 голос
/ 29 мая 2019

Вам нужно исправить две проблемы, чтобы ваша ссылка на следующую страницу работала. Кроме того, на что указал @pako, вы могли бы использовать .extract_first() или .get(), чтобы получить первый элемент массива. Исправленный должен быть больше похож на .xpath('//a[@class="next_page"]/@href').get(). Я переписал некоторые ваши xpath-ы, чтобы исключить пробелы из вывода.

class goodReadsSpider(scrapy.Spider):
    name='goodreads'

    start_urls = ['https://www.goodreads.com/quotes?page=1']

    def parse(self,response):
        for quote in response.xpath('//div[@class="quote"]'):
            yield {
                'text':quote.xpath('normalize-space(.//div[@class="quoteText"]/text())').getall(),
                'author':quote.xpath('normalize-space(.//span[@class="authorOrTitle"]/text())').get(),
                'tags':quote.xpath('.//div[contains(@class,"greyText")]/a/text()').getall()
            }

        next_page = response.xpath('//a[@class="next_page"]/@href').get()
        if next_page:
            nlink = response.urljoin(next_page)
            yield scrapy.Request(url=nlink,callback=self.parse)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...