如何使用scrapy抓取下拉菜单中隐藏的链接?

时间:2019-05-15 00:42:41

标签: web-scraping scrapy

我将从网页上抓取NFL深度图,例如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>

我阅读了Web scrape get drop-down menu data python帖子,我认为这很有帮助,因为他表示该网页使用了JavaScript。

但是那个答案使用硒。我想知道我是否可以使用scrapy或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 个答案:

答案 0 :(得分:1)

您可以使用每个value标签上的option参数来构建URL。

例如,引用05/01/2019的菜单的value=220标签中有option

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

点击此菜单时打开的网址是:

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>