python - 如何从网站中提取冠状病毒病例?
问题描述
我正在尝试从网站 ( https://www.trackcorona.live ) 中提取冠状病毒,但出现错误。
这是我的代码:
response = requests.get('https://www.trackcorona.live')
data = BeautifulSoup(response.text,'html.parser')
li = data.find_all(class_='numbers')
confirmed = int(li[0].get_text())
print('Confirmed Cases:', confirmed)
它给出了以下错误(尽管几天前它还在工作),因为它返回一个空列表(li)
IndexError
Traceback (most recent call last)
<ipython-input-15-7a09f39edc9d> in <module>
2 data=BeautifulSoup(response.text,'html.parser')
3 li=data.find_all(class_='numbers')
----> 4 confirmed = int(li[0].get_text())
5 countries = li[1].get_text()
6 dead = int(li[3].get_text())
IndexError: list index out of range
</p>
解决方案
好吧,实际上网站正在生成一个重定向CloudFlare
,然后它会JavaScript
在页面加载后动态加载,因此我们可以使用多种方法,例如selenium
andrequests_html
但我会为您提到最快的解决方案,因为我们将JS
即时渲染:)
import cloudscraper
from bs4 import BeautifulSoup
scraper = cloudscraper.create_scraper()
html = scraper.get("https://www.trackcorona.live/").text
soup = BeautifulSoup(html, 'html.parser')
confirmed = soup.find("a", id="valueTot").text
print(confirmed)
输出:
110981
提示
503
response code
:
基本上该代码指的是service unavailable
.
从技术上讲,GET
无法满足您发送的请求。这是因为请求被卡在https://www.trackcorona.live/receiver
的请求之间的原因是它在哪里处理它到另一个源,即https://www.trackcorona.live/?cf_chl_jschl_tk =HOST
在哪里__cf_chl_jschl_tk__=
持有token
要认证的。
因此,您通常应该按照您的代码来为host
所需数据提供服务。
类似于以下显示end
网址的内容:
import requests
from bs4 import BeautifulSoup
def Main():
with requests.Session() as req:
url = "https://www.trackcorona.live"
r = req.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
redirect = f"{url}{soup.find('form', id='challenge-form').get('action')}"
print(redirect)
Main()
输出:
https://www.trackcorona.live/?__cf_chl_jschl_tk__=575fd56c234f0804bd8c87699cb666f0e7a1a114-1583762269-0-AYhCh90kwsOry_PAJXNLA0j6lDm0RazZpssum94DJw013Z4EvguHAyhBvcbhRvNFWERtJ6uDUC5gOG6r64TOrAcqEIni_-z1fjzj2uhEL5DvkbKwBaqMeIZkB7Ax1V8kV_EgIzBAeD2t6j7jBZ9-bsgBBX9SyQRSALSHT7eXjz8r1RjQT0SCzuSBo1xpAqktNFf-qME8HZ7fEOHAnBIhv8a0eod8mDmIBDCU2-r6NSOw49BAxDTDL57YAnmCibqdwjv8y3Yf8rYzm2bPh74SxVc
现在能够调用 endURL
所以你需要传递所需的Form-Data
:
像这样的东西:
def Main():
with requests.Session() as req:
url = "https://www.trackcorona.live"
r = req.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
redirect = f"{url}{soup.find('form', id='challenge-form').get('action')}"
data = {
'r': 'none',
'jschl_vc': 'none',
'pass': 'none',
'jschl_answer': 'none'
}
r = req.post(redirect, data=data)
print(r.text)
Main()
在这里,您最终将
text
没有您想要的值。因为您的值是通过JS
.
推荐阅读
- mysql - MySQL 语句 - 选择 Concat 之类的位置
- amazon-web-services - 连接到极光无服务器
- sql - 在oracle sql中将字符串格式的日期转换为日期时间格式
- git - 我可以恢复没有在本地保存的已删除 git 分支吗?
- slack-api - 在 Slack 中将远程文件作为直接消息共享
- image-processing - 重建图像与原始图像之间的误差图
- go - 仅当密钥不存在于 Google Datastore 中时才写入实体
- android - Recycler 视图中的表格布局
- swagger - 从 Swagger UI 隐藏复杂的只读属性
- flutter - Flutter Firestore Operator 未定义