网页抓取 Python beautifulsoup
Web scraping Python beautifulsoup
我正在尝试创建一个从网站 https://www.superherodb.com/ and fetches the information on all the superheroes (seen on:https://www.superherodb.com/characters) 的各个页面扫描网站的爬虫。我想获取有关英雄的所有信息:统计数据、能力、装备、出身、联系等。但是我无法从英雄页面访问他们的统计数据。
例如这个页面:https://www.superherodb.com/001/10-39302/
对于英雄页面中的能量统计部分,我试过:
bs_test.find_all("div", {"class": "stat-value"})
和:
bs_test.select(".stat-value")
但是输出总是输出0作为值:
[<div class="stat-value">0</div>,
<div class="stat-value">0</div>,
<div class="stat-value">0</div>,
<div class="stat-value">0</div>,
<div class="stat-value">0</div>,
<div class="stat-value">0</div>,
<div class="stat-value">0</div>]
我在这里错过了什么?请帮助我。
在那里看不到它们。尝试抓取 而不是 stat_value。它提供以下数据:
stats_10_39302_shdb = {"stats":{"int":140,"str":45,"spe":5,"dur":5,"pow":0,"com" :20,"tie":0},"bars":{"int":70,"str":1,"spe":1,"dur":5,"pow":0,"com":20 “并列”:0}
以汉族为例
数据是在页面加载后由 JS 注入的,但是 requests.get
只给你静态的 HTML,它在 <script>
标签旁边有占位符值 [=25] =] 带有实际数据的 JS 对象。
跟进 ,以下是从 .footnote script
元素中提取数据的方法:
import json
import re
import requests
response = requests.get("https://www.superherodb.com/001/10-39302/")
response.raise_for_status()
stats = [json.loads(x) for x in re.findall(r'{"stats":[^;]+', response.text)]
print(json.dumps(stats, indent=2))
输出:
[
{
"stats": {
"int": 140,
"str": 45,
"spe": 5,
"dur": 5,
"pow": 0,
"com": 20,
"tie": 0
},
"bars": {
"int": 70,
"str": 1,
"spe": 1,
"dur": 5,
"pow": 0,
"com": 20,
"tie": 0
},
"shdbclass": {
"value": 10,
"visual": 10,
"level": 1
},
"specials": {
"omnipotent": 0,
"omniscient": 0,
"omnipresent": 0
}
},
{
"stats": {
"int": 100,
"str": 100,
"spe": 10,
"dur": 1,
"pow": 1,
"com": 1,
"tie": 9
},
"bars": {
"int": 50,
"str": 1,
"spe": 6,
"dur": 1,
"pow": 1,
"com": 1,
"tie": 90
},
"shdbclass": {
"value": 20.5,
"visual": 21,
"level": 1
},
"specials": {
"omnipotent": 0,
"omniscient": 0,
"omnipresent": 0
},
"ustats": 1
}
]
请参阅规范 Web-scraping JavaScript page with Python 以了解此方法的概括以及更多关于抓取 JS-driven 页面的解释和策略。
我正在尝试创建一个从网站 https://www.superherodb.com/ and fetches the information on all the superheroes (seen on:https://www.superherodb.com/characters) 的各个页面扫描网站的爬虫。我想获取有关英雄的所有信息:统计数据、能力、装备、出身、联系等。但是我无法从英雄页面访问他们的统计数据。
例如这个页面:https://www.superherodb.com/001/10-39302/
对于英雄页面中的能量统计部分,我试过:
bs_test.find_all("div", {"class": "stat-value"})
和:
bs_test.select(".stat-value")
但是输出总是输出0作为值:
[<div class="stat-value">0</div>,
<div class="stat-value">0</div>,
<div class="stat-value">0</div>,
<div class="stat-value">0</div>,
<div class="stat-value">0</div>,
<div class="stat-value">0</div>,
<div class="stat-value">0</div>]
我在这里错过了什么?请帮助我。
在那里看不到它们。尝试抓取
stats_10_39302_shdb = {"stats":{"int":140,"str":45,"spe":5,"dur":5,"pow":0,"com" :20,"tie":0},"bars":{"int":70,"str":1,"spe":1,"dur":5,"pow":0,"com":20 “并列”:0}
以汉族为例
数据是在页面加载后由 JS 注入的,但是 requests.get
只给你静态的 HTML,它在 <script>
标签旁边有占位符值 [=25] =] 带有实际数据的 JS 对象。
跟进 .footnote script
元素中提取数据的方法:
import json
import re
import requests
response = requests.get("https://www.superherodb.com/001/10-39302/")
response.raise_for_status()
stats = [json.loads(x) for x in re.findall(r'{"stats":[^;]+', response.text)]
print(json.dumps(stats, indent=2))
输出:
[
{
"stats": {
"int": 140,
"str": 45,
"spe": 5,
"dur": 5,
"pow": 0,
"com": 20,
"tie": 0
},
"bars": {
"int": 70,
"str": 1,
"spe": 1,
"dur": 5,
"pow": 0,
"com": 20,
"tie": 0
},
"shdbclass": {
"value": 10,
"visual": 10,
"level": 1
},
"specials": {
"omnipotent": 0,
"omniscient": 0,
"omnipresent": 0
}
},
{
"stats": {
"int": 100,
"str": 100,
"spe": 10,
"dur": 1,
"pow": 1,
"com": 1,
"tie": 9
},
"bars": {
"int": 50,
"str": 1,
"spe": 6,
"dur": 1,
"pow": 1,
"com": 1,
"tie": 90
},
"shdbclass": {
"value": 20.5,
"visual": 21,
"level": 1
},
"specials": {
"omnipotent": 0,
"omniscient": 0,
"omnipresent": 0
},
"ustats": 1
}
]
请参阅规范 Web-scraping JavaScript page with Python 以了解此方法的概括以及更多关于抓取 JS-driven 页面的解释和策略。