Веб-парсинг: пустые / нет данных / пустые записи при запуске паука, правильные записи в оболочке scrapy

Сканируя веб-сайт с порно, я делаю паука, который ползает по страницам в поисках новейших видео, очищая метаданные для каждого из 32 видео на странице.

Далее мой код для паука:

class NaughtySpider(scrapy.Spider):
  name = "naughtyspider"
  allowed_domains = ["pornhub.com"]
  max_pages = 3
  # Start request
  def start_requests(self):
        for i in range(1, self.max_pages):
            yield scrapy.Request('https://www.pornhub.com/video?o=cm&page=%s' % i, callback=self.parse_video)
  # First parsing method
  def parse_video(self, response):
    self.log('F i n i s h e d  s c r a p i n g ' + response.url)
    video_links = response.css('ul#videoCategory').css('li.videoBox').css('div.thumbnail-info-wrapper').css('span.title > a').css('::attr(href)') #Correct path, chooses 32 videos from page ignoring the links coming from ads
    links_to_follow = video_links.extract()
    for url in links_to_follow:
      yield response.follow(url = url,
                            callback = self.parse_metadata)
  # Second parsing method
  def parse_metadata(self, response):
    # Create a SelectorList of the course titles text
    video_title = response.css('div.title-container > h1.title > span.inlineFree::text')
    # Extract the text and strip it clean
    video_title_ext = video_title.extract_first()
    # Extract views
    video_views = response.css('span.count::text').extract_first()
    # Extract tags
    video_tags = response.css('div.tagsWrapper a::text').extract()
    # Extract Categories
    video_categories = response.css('div.categoriesWrapper a::text').extract()
    # Fill in the dictionary
    yield {
        'title': video_title_ext,
        'views': video_views,
        'tags': video_tags,
        'categories': video_categories,
    }

Дело в том, что почти половина записей оказывается пустыми, без заголовка, представлений, тегов или категорий. Пример журнала:

[scrapy.core.scraper] DEBUG: Scraped from <200 https://www.pornhub.com/view_video.php?viewkey=ph5d594b093f8d6>
{'title': None, 'views': None, 'tags': [], 'categories': []}

Но в то же время, если я получу ту же самую ссылку в оболочке scrapy и скопирую и вставлю те же самые пути селектора в паук, это даст мне правильные значения:

In [4]: fetch('https://www.pornhub.com/view_video.php?viewkey=ph5d594b093f8d6')
[scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.pornhub.com/view_video.php?viewkey=ph5d594b093f8d6> (referer: None)

In [5]: response.css('div.tagsWrapper a::text').extract()
Out[5]: ['alday', '559', '+ ']

In [6]: response.css('span.count::text').extract_first()
Out[6]: '6'

Заранее благодарю за любую помощь.

Изменить. Правильно ли я полагаю, что это не проблема моего кода, а скорее ограничение на сервере, чтобы избежать соскабливания?


person Kuku    schedule 18.08.2019    source источник
comment
Возможно, вас пока еще распознают как бота, и вам дадут другой ответ. Сохраните ответ, который получает паук, в файл и сравните с ответом, полученным от scrapy shell.   -  person Gallaecio    schedule 19.08.2019


Ответы (1)


Такие данные, как просмотры, продолжительность и т. Д., Похоже, вызываются элементом переменной HTML <var> DATA </var>. Например, если вы введете следующую строку в оболочку scrapy, вы должны получить представления.

response.xpath(".//var[@class='duration')")

Не уверен, что это сработает, но попробовать стоит.

П.с. Придется сказать жене, что это было в образовательных целях ..

person Bamieschijf    schedule 18.08.2019
comment
Хм, я не уверен, что понимаю то, что вы предлагаете в качестве ответа. Указанный вами xpath считается недопустимым синтаксисом, даже когда я исправляю правую квадратную скобку. Я также не вижу, откуда это взялось, когда проверяю элементы на сайте. Это также не объясняет, почему мой путь был неправильным, учитывая, что он работает в оболочке scrapy (и для половины записей после сканирования). Однако я ценю твою моральную жертву. - person Kuku; 18.08.2019
comment
‹Span class = views› ‹var› 113 ‹/var› views ‹/span› Вот как я это вижу, когда проверяю элемент. Ммм. - person Bamieschijf; 18.08.2019
comment
Я вижу это так: ‹div class = views› ‹span class = count› 11 ‹/span› views ‹/div›. Вы смотрите на просмотры видео по миниатюре или по реальной ссылке на видео? Дело в том, что моя проблема не в доступе к представлениям, как видно из примера оболочки scrapy в моем вопросе. - person Kuku; 18.08.2019