在 Python 中抓取具有可点击内容的网站

Posted

技术标签:

【中文标题】在 Python 中抓取具有可点击内容的网站【英文标题】:Scraping a website with clickable content in Python 【发布时间】:2015-05-12 18:07:34 【问题描述】:

我想废弃以下网站的内容:

http://financials.morningstar.com/ratios/r.html?t=AMD

Key Ratios 下,我想点击“增长”按钮,然后在 Python 中抓取数据。

我该怎么做?

【问题讨论】:

尝试使用Firefox中的HttpFox工具栏查找调用的URL,但没有多大成功。谢谢。 附带一点评论:BBG 也以更容易抓取的格式提供此功能,但令人惊讶的是,晨星早在 10 年前就提供了它。很有趣。 【参考方案1】:

你可以用requests+BeautifulSoup解决它。有一个异步的GET 请求发送到您需要模拟的http://financials.morningstar.com/financials/getKeyStatPart.html 端点。 Growth 表位于 div 内,id="tab-growth"

from bs4 import BeautifulSoup
import requests


url = 'http://financials.morningstar.com/ratios/r.html?t=AMD'
keystat_url = 'http://financials.morningstar.com/financials/getKeyStatPart.html'

with requests.Session() as session:
    session.headers = 'User-Agent': 'Mozilla/5.0 (Linux; U; android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'

    # visit the target url
    session.get(url)

    params = 
        'callback': '',
        't': 'XNAS:AMD',
        'region': 'usa',
        'culture': 'en-US',
        'cur': '',
        'order': 'asc',
        '_': '1426047023943'
    
    response = session.get(keystat_url, params=params)

    # get the HTML part from the JSON response
    soup = BeautifulSoup(response.json()['componentData'])

    # grab the data
    for row in soup.select('div#tab-growth table tr'):
        print row.text

【讨论】:

这是一个很好的答案,alecxe。您是如何找到 keystat_url = 'http://financials.morningstar.com/financials/getKeyStatPart.html' 的以及您是如何找到 params 的?如果我想要另一家公司的数据而不是 AMD,比如说 AAPL,params 会保持不变吗?最后你是怎么想出session.headers的内容的?非常感谢您的帮助。 @TJ1 第一步是通过获取http://financials.morningstar.com/ratios/r.html?t=AMD 页面来确定requests 是否会为我提供所需的div#tab-growth。数据不存在,这意味着它是异步加载的——我使用浏览器开发工具检查在页面加载期间发送了哪些请求,并发现了对 getKeyStatPart 端点的 XHR 请求——检查了参数并在代码中重复了它们. User-Agent 标头只是为了伪装成浏览器(不确定在这种情况下是否需要)。 @TJ1 如果您要更改公司,您还需要更改t 参数值。 1426047023943params 列表中的值是多少?我可以省略这个吗? @TJ1 当然,谢谢。由于这是一个JSONP - 回调值会影响实际响应 - 在jsonp1426046772712 值的情况下 - json 响应将像jsonp1426046772712([...json..]) 这样包裹。如果callback 值为空,我们会得到一个可以直接使用response.json() 读取的纯JSON。希望这是有道理的。

以上是关于在 Python 中抓取具有可点击内容的网站的主要内容,如果未能解决你的问题,请参考以下文章

如何用Python爬虫抓取网页内容?

Python爬虫,抓取淘宝商品评论内容

Python抓取手机APP中内容

爬虫,可用于增加访问量和抓取网站全页内容

反爬虫2-python3.6 正则表达式抓取猫眼电影TOP100

使用webpasser抓取某笑话网站整站内容