IMDB веб-сканер - Scrapy - Python - PullRequest
       15

IMDB веб-сканер - Scrapy - Python

0 голосов
/ 26 августа 2018
import scrapy
from imdbscrape.items import MovieItem

class MovieSpider(scrapy.Spider):
    name = 'movie'
    allowed_domains = ['imdb.com']
    start_urls = ['https://www.imdb.com/search/title?year=2017,2018&title_type=feature&sort=moviemeter,asc']

    def parse(self, response):
        urls = response.css('h3.lister-item-header > a::attr(href)').extract()
        for url in urls:
            yield scrapy.Request(url=response.urljoin(url),callback=self.parse_movie)

        nextpg = response.css('div.desc > a::attr(href)').extract_first()
        if nextpg:
            nextpg = response.urljoin(nextpg)
            yield scrapy.Request(url=nextpg,callback=self.parse)

    def parse_movie(self, response):
        item = MovieItem()
        item['title'] = self.getTitle(response)
        item['year'] = self.getYear(response)
        item['rating'] = self.getRating(response)
        item['genre'] = self.getGenre(response)
        item['director'] = self.getDirector(response)
        item['summary'] = self.getSummary(response)
        item['actors'] = self.getActors(response)
        yield item

Я написал приведенный выше код для очистки всех фильмов IMDB с 2017 года до настоящего времени. Но этот код очищает только 100 фильмов. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 26 августа 2018

Я считаю, что проблема связана с

nextpg = response.css('div.desc > a::attr(href)').extract_first()

На этой странице https://www.imdb.com/search/title?year=2017,2018&title_type=feature&sort=moviemeter,asc

код для ссылки на следующую страницу:

<div class="desc">
    <span class="lister-current-first-item">1</span> to
    <span class="lister-current-last-item">50</span> of 24,842 titles
    <span class="ghost">|</span>
    <a href="?year=2017,2018&amp;title_type=feature&amp;sort=moviemeter,asc&amp;page=2&amp;ref_=adv_nxt" class="lister-page-next next-page" ref-marker="adv_nxt">Next »</a>
</div>

Ваш кодзахватывает ссылку с текстом привязки. Далее >>

, это

https://www.imdb.com/search/title?year=2017,2018&title_type=feature&sort=moviemeter,asc&page=2&ref_=adv_nxt

Вы переходите на эту страницу и очищаете следующие 50 фильмов

однако HTML в div с классом desc содержит ДВА ссылки.Не такой, как первая страница.

Первая ссылка - это предыдущая ссылка, а не следующая.

<div class="desc">
    <span class="lister-current-first-item">51</span> to
    <span class="lister-current-last-item">100</span> of 24,842 titles
    <span class="ghost">|</span> <a href="?year=2017,2018&amp;title_type=feature&amp;sort=moviemeter,asc&amp;page=1&amp;ref_=adv_prv" class="lister-page-prev prev-page" ref-marker="adv_nxt">« Previous</a>
    <span class="ghost">|</span> <a href="?year=2017,2018&amp;title_type=feature&amp;sort=moviemeter,asc&amp;page=3&amp;ref_=adv_nxt" class="lister-page-next next-page" ref-marker="adv_nxt">Next »</a>
</div>

Что бы я сделал, это установил счетчик на 0.

Увеличение при успешной очистке.

Если счетчик больше 0, тогда захватите вторую ссылкуи перейдите по этой ссылке и обработайте результаты на этой странице

Если счетчик не больше 0, тогда возьмите первую ссылку и перейдите по ней и очистите результаты на этой странице

...