Фрагменты Python, извлеченные из URL, не являются теми, которые установлены в start_urls

#python #python-3.x #web-scraping #scrapy

#python #python-3.x #веб-очистка #scrapy

Вопрос:

я новичок в использовании scrapy, и у меня есть сомнения по поводу очищенных URL-адресов.

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

 meta={'dont_redirect': True, 'handle_httpstatus_list': [301, 302]
  

чтобы избежать перенаправления, но очищенный от URL-адреса все еще был неправильным. Итак, я подумал, что проблема в файлах cookie, и чтобы проверить это, я жестко запрограммировал файлы cookie, чтобы они были такими же, как в браузере при входе на сайт, и теперь это не перенаправление, и мне даже не нужно указывать ‘dont_redirect’ в meta, но когда я смотрю на отладчик, он все еще очищает домашнюю страницу.

на данный момент код выглядит следующим образом:

 
import scrapy


class MatchOpeningSpider(scrapy.Spider):
    name = 'bet_365_match_opening'
    start_urls = [
        'https://www.bet365.com/#/AC/B1/C1/D13/E38078994/F2/'
    ]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, cookies={
                'pstk': '04761A56B7A54D9BB3948A093FB9F440000003',
                'rmbs': 3,
                'aps03': 'lng=22amp;tzi=34amp;oty=2amp;ct=28amp;cg=1amp;cst=0amp;hd=Namp;cf=N',
                'session': 'processform=0amp;fms=1'
            })

    def parse(self, response):
        games = response.css('div.sl-CouponParticipantWithBookCloses_Name').extract()
        yield {'games': games}
  

при отладке вы можете видеть, что просмотренный URL-адрес правильный, но извлеченный из — это домашняя страница

 2019-04-21 12:02:37 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.bet365.com/#/AC/B1/C1/D13/E38078994/F2/> (referer: None)
2019-04-21 12:02:37 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.bet365.com/>

  

Что я делаю не так?
Спасибо за помощь!!!

Ответ №1:

В вашем start_url есть идентификатор фрагмента (острый знак: #) в середине, контекст после него не будет передаваться браузером

Это означает, что нужные вам данные могут содержаться не в HTTP-ответе start_url, а в некоторых других вызовах Ajax после этого основного запроса документа и рендеринга на стороне клиента

Мои предложения:

  1. Сначала используйте инструменты разработки браузера, или оболочку Scrapy, или даже инструменты CURL, чтобы убедиться, что необходимый вам контент существует в http-ответе start_url. Или вы удаляете неправильный URL

  2. Сделайте заголовки http, файлы cookie, полностью такими же, как в реальном браузере. Scrapy обрабатывает перенаправление 3xx и изменения файлов cookie для вас, но вам нужно будет найти и представить фактический путь посещения в вашей программе spider

  3. Если данные отображаются на стороне клиента, и вы устали от этого, попробуйте spider на основе Selenium, чтобы использовать браузер с движком JS для решения этих проблем