scrapy не работает на страницах с ключевыми словами imdb - PullRequest
0 голосов
/ 02 мая 2020

Вот как я собираюсь работать с этим кодом; У меня есть ключевое слово, скажем, "гаджеты". Я ищу заголовки на странице расширенного поиска IMDB. Я хочу код go для каждой титульной страницы, затем go для страницы ключевых слов каждого заголовка, а затем загрузить заголовок и все ключевые слова. Структура кода выглядит хорошо для меня, но она действительно не работает. Пожалуйста, предложите, нужно ли это переписать или это можно исправить с помощью какого-нибудь совета?

Вот мой паук:

import scrapy

class KwordsSpider(scrapy.Spider):
    name= 'ImdbSpider'
    allowed_domains = ['imdb.com']
    start_urls = [
        'https://www.imdb.com/search/title/?keywords=gadgets'
    ]    
    def parse(self, response):
        titleLinks = response.xpath('//*[@class="lister-item-content"]')

        for link in titleLinks:
            title_url = 'https://www.imdb.com'+link.xpath('.//h3/a/@href').extract_first()
            yield scrapy.Request(title_url, callback=self.parse_title)
        next_page_url = 'https://www.imdb.com'+response.xpath('//div[@class="article"]/div[@class="desc"]/a[@href]').extract_first()
        if next_page_url is not None:
            next_page_url = response.urljoin(next_page_url)
        yield scrapy.Request(next_page_url, callback=self.parse) 

    def parse_title(self, response):
        keywords_url = 'https://www.imdb.com' + response.xpath('//nobr/a[@href]').extract_first()

        yield scrapy.Request(keywords_url, callback=self.parse_keys)
    #looking at the keywords page
    def parse_keys(self, response):
        title = response.xpath('//h3/a/text()').extract_first()
        keys = response.xpath('//div[@class="sodatext"]/a/text()').extract()
        print('my print'+title)    
        yield{
            'title': title,
            'Keywords': keys,
        }

Ниже приведено несколько линий силовой оболочки

2020-05-02 08:33:40 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2020-05-02 08:33:40 [scrapy.core.engine] INFO: Spider opened
2020-05-02 08:33:40 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2020-05-02 08:33:40 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2020-05-02 08:33:43 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.imdb.com/search/title/?keywords=gadgets> (referer: None)
2020-05-02 08:33:43 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'www.imdb.com<a href="': <GET https://www.imdb.com<a href="/search/title/?keywords=gadgets&amp;start=51%22%20class=%22lister-page-next%20next-page%22%3ENext%20%C2%BB%3C/a%3E>
2020-05-02 08:33:46 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.imdb.com/title/tt3896198/> (referer: https://www.imdb.com/search/title/?keywords=gadgets)
2020-05-02 08:34:11 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.imdb.com/title/tt0369171/> (referer: https://www.imdb.com/search/title/?keywords=gadgets)
2020-05-02 08:34:11 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.imdb.com/title/tt1149317/> (referer: https://www.imdb.com/search/title/?keywords=gadgets)
2020-05-02 08:34:11 [scrapy.core.engine] INFO: Closing spider (finished)

1 Ответ

1 голос
/ 02 мая 2020

Мало xpaths в вашем скрипте были неправильными. Я исправил их. Это должно работать сейчас.

class KwordsSpider(scrapy.Spider):
    name = 'ImdbSpider'
    start_urls = [
        'https://www.imdb.com/search/title/?keywords=gadgets'
    ]    
    def parse(self, response):
        titleLinks = response.xpath('//*[@class="lister-item-content"]')

        for link in titleLinks:
            title_url = response.urljoin(link.xpath('.//h3/a/@href').get())
            yield scrapy.Request(title_url, callback=self.parse_title)

        next_page_url = response.xpath('//div[@class="article"]/div[@class="desc"]/a/@href').get()
        if next_page_url:
            next_page_url = response.urljoin(next_page_url)
            yield scrapy.Request(next_page_url, callback=self.parse) 

    def parse_title(self, response):
        keywords_url = response.urljoin(response.xpath('//nobr/a/@href').get())
        yield scrapy.Request(keywords_url, callback=self.parse_keys)

    def parse_keys(self, response):
        title = response.xpath('//h3/a/text()').get()
        keys = response.xpath('//div[@class="sodatext"]/a/text()').getall()
        yield {
            'title': title,
            'Keywords': keys,
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...