Как очистить ссылки, спрятанные в выпадающем меню, используя scrapy? - PullRequest
0 голосов
/ 15 мая 2019

Я собираюсь вычеркнуть графики глубины НФЛ из веб-страниц, например. https://www.ourlads.com/nfldepthcharts/archive/220/BUF. Теперь я хочу получить все ссылки на страницы такого типа, но исходный код выпадающего меню «Архивные даты» не содержит ссылок:

    <option value="">-- Archive Dates --</option>
    <option value="220">05/01/2019</option>
    <option value="219">04/01/2019</option>
    <option value="218">03/01/2019</option>
    <option value="217">02/01/2019</option>
    <option value="216">01/01/2019</option>
    <option value="215">12/01/2018</option>
    <option value="214">11/01/2018</option>
    <option value="213">10/01/2018</option>
    <option value="212">09/01/2018</option>
    <option value="211">08/01/2018</option>

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

Но этот ответ использует селен. Интересно, смогу ли я решить проблему с помощью скрапа или Beautifulsoup.

Ниже приведена структура моего скребка.

class depth_chart_archive_spider(scrapy.Spider):
    name = "depth_chart_archive"
    start_urls = ('https://www.ourlads.com/nfldepthcharts/',)

    def parse(self, response):
        dchome = BeautifulSoup(response.body, 'html.parser')

        # get the links somehow

        for link in links:
            yield scrapy.Request(link, callback = self.parse_team)

    def parse_team(self, response):
        # parse the page

1 Ответ

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

Вы можете создать URL с помощью параметра value, найденного в каждом теге option.

Например, меню, ссылающееся на 01.05.2009, содержит value=220 в теге option

<option value="220">05/01/2019</option>

URL, который открывается при нажатии на это меню:

https://www.ourlads.com/nfldepthcharts/archive/220/BUF

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

site_url = 'https://www.ourlads.com/nfldepthcharts/archive/{code}/BUF'

for code in response.xpath('//option/@value').re(r'\d+'):
    yield Request(site_url.format(code=code))

Регулярное выражение только для того, чтобы не запрашивать первый элемент <option value="">-- Archive Dates --</option>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...