【问题标题】:How to Build a Dynamic Web Scraper/Crawler: Python如何构建动态 Web Scraper/Crawler:Python
【发布时间】:2018-12-11 08:38:30
【问题描述】:

不太确定这个问题的复杂性,但我想我会试一试。

我如何创建一个网络爬虫/抓取工具(不确定我需要哪个)来获取所有 CEO 薪酬比率数据的 csv。 https://www.bloomberg.com/graphics/ceo-pay-ratio/

我希望此信息用于进一步分析,但是,我不确定如何为动态网页检索它。我过去曾构建过网络抓取工具,但只是针对简单的网站和功能。

如果你能给我指出一个好的资源或发布下面的代码,我将永远欠你的债。

提前致谢!

【问题讨论】:

    标签: python web-scraping web-crawler finance data-retrieval


    【解决方案1】:

    请注意,抓取此网站可能会被标记为“违反服务条款”,此特定网站使用多种技术来避免基于脚本引擎的抓取。


    如果您检查网页,您可能会发现当您单击下一步按钮时,没有 XHR 请求。所以你可以推断内容只加载了一次。

    如果按大小对请求数据进行排序,会发现所有数据都是从json file加载的


    使用python(但您需要在运行python脚本之前打开页面):

    import requests
    data=requests.get("https://www.bloomberg.com/graphics/ceo-pay-ratio/live-data/ceo-pay-ratio/live/data.json").json()
    for each in data['companies']:
        try:
            print "Company",each['c'],"=> CEO pay ratio",each['cpr']
        except:
            print "Company",each['c'],"=> no CEO pay ratio !"
    

    哪个给你:

    Company Aflac Inc => CEO pay ratio 300
    Company American Campus Communities Inc => CEO pay ratio 226
    Company Aetna Inc => CEO pay ratio 235
    Company Ameren Corp => CEO pay ratio 66
    Company AmerisourceBergen Corp => CEO pay ratio 0
    Company Advance Auto Parts Inc => CEO pay ratio 329
    Company American International Group Inc => CEO pay ratio 697
    Company Arthur J Gallagher & Co => CEO pay ratio 126
    Company Arch Capital Group Ltd => CEO pay ratio 104
    Company ACADIA Pharmaceuticals Inc => CEO pay ratio 54
    [...]
    

    在浏览器中打开 json 然后将其保存在本地可能比尝试请求网站更好。

    在本地将 json 保存为 data.json 后,您可以阅读:

    import json
    
    with open("data.json","r") as f:
        cont=f.read()
    
    data=json.loads(cont)
    
    for each in data['companies']:
        try:
            print "Company",each['c'],"=> CEO pay ratio",each['cpr']
        except:
            print "Company",each['c'],"=> no CEO pay ratio !"
    

    【讨论】:

    • import requests data=requests.get("bloomberg.com/graphics/ceo-pay-ratio/live-data/ceo-pay-ratio/… for each in data['companies']: try: print("Company",each['c'],"=> CEO pay ratio",each['cpr']) except: print("Company",each['c'],"=> no CEO pay ratio !") 输入此代码后出现回溯错误...无论如何您可以为本地保存的 .json 或 .csv 重写代码真的很感激 :)
    • 回溯(最近一次通话最后):文件“.\CEOpayratio.py”,第 2 行,在 data=requests.get("bloomberg.com/graphics/ceo-pay-ratio/live-data/ceo-pay-ratio/… File "C:\Users\Seane \AppData\Local\Programs\Python\Python36\lib\site-packages\requests\models.py”,第 896 行,在 json 中返回 complexjson.loads(self.text, **kwargs) 文件“C:\Users\Seane \AppData\Local\Programs\Python\Python36\lib\site-packages\simplejson_init_.py",第 518 行,加载返回 _default_decoder.decode(s)
    • 谢谢!非常感谢您的帮助
    【解决方案2】:

    由于网站似乎是动态加载内容,我相信您将需要 Selenium,一个自动浏览器的库,和 BeautifulSoup,一个解析生成网页的库。

    由于您感兴趣的网站部分只是一个页面,您只需要检索数据,我建议您首先调查数据是如何加载到页面的。您可以使用与脚本相同的参数直接向他们的服务器发出请求以直接检索您感兴趣的数据,这似乎是合理的。

    要提出这样的请求,您可以考虑使用另一个名为 requests 的库。

    【讨论】:

    • 谢谢!感谢反馈
    猜你喜欢
    • 1970-01-01
    • 2015-08-16
    • 2011-01-08
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多