如何构建动态网站 Scraper/Crawler:Python
How to Build a Dynamic Web Scraper/Crawler: Python
不太确定这个问题的复杂性,但我想我会试一试。
我如何创建一个网络 crawler/scraper(不确定我需要哪个)来获取所有 CEO 薪酬比率数据的 csv。 https://www.bloomberg.com/graphics/ceo-pay-ratio/
我想要此信息以供进一步分析,但是,我不确定如何为动态网页检索它。我过去构建过网络抓取工具,但用于简单的网站和功能。
如果你能给我指出一个好的资源或post下面的代码,我将永远感激你。
提前致谢!
由于该网站似乎动态加载内容,我相信您将需要 Selenium, a library that automates browsers, and BeautifulSoup,一个用于解析结果网页的库。
由于您感兴趣的网站部分只是一个页面,您只需要检索数据我建议您首先调查数据是如何加载到页面的。您可以使用与脚本相同的参数直接向他们的服务器发出请求,以直接检索您感兴趣的数据,这似乎是合理的。
要发出这样的请求,您可以考虑使用另一个名为 requests.
的库
请注意,抓取该网站可能会被标记为“违反服务条款”,该特定网站使用多种技术来避免基于脚本引擎的抓取。
如果您检查该网页,您可能会发现当您单击下一步按钮时没有 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
[...]
在 webrowser 中打开 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 !"
不太确定这个问题的复杂性,但我想我会试一试。
我如何创建一个网络 crawler/scraper(不确定我需要哪个)来获取所有 CEO 薪酬比率数据的 csv。 https://www.bloomberg.com/graphics/ceo-pay-ratio/
我想要此信息以供进一步分析,但是,我不确定如何为动态网页检索它。我过去构建过网络抓取工具,但用于简单的网站和功能。
如果你能给我指出一个好的资源或post下面的代码,我将永远感激你。
提前致谢!
由于该网站似乎动态加载内容,我相信您将需要 Selenium, a library that automates browsers, and BeautifulSoup,一个用于解析结果网页的库。
由于您感兴趣的网站部分只是一个页面,您只需要检索数据我建议您首先调查数据是如何加载到页面的。您可以使用与脚本相同的参数直接向他们的服务器发出请求,以直接检索您感兴趣的数据,这似乎是合理的。
要发出这样的请求,您可以考虑使用另一个名为 requests.
的库请注意,抓取该网站可能会被标记为“违反服务条款”,该特定网站使用多种技术来避免基于脚本引擎的抓取。
如果您检查该网页,您可能会发现当您单击下一步按钮时没有 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
[...]
在 webrowser 中打开 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 !"