网页抓取:输出结果与原始数据不同

3

我试图对显示倒计时的网站进行网络爬虫(最终目标是制作一个Discord机器人,在请求时显示剩余的计时器时间)。然而,当打印数据时,输出与原始来源不同。

寻找解决方案时,我找不到解决我的问题的方法。我确信自己错过了什么,但不知道具体是什么(这只是我的个人项目,之前很少接触过Python)。

import requests
from bs4 import BeautifulSoup

result = requests.get("https://www.wowclassiccountdown.com/")
result.status_code
result.headers

c = result.content

soup = BeautifulSoup(c)

samples = soup.find_all("div", "fusion-digit")
samples[0]

data = {}
for div in samples:
    title = div.string.strip()
    data[title] = div.attrs['class']

    # displays data
    print(data)

我无法告诉你预期的输出结果,因为它总是在变化,但明显不应该全部为0。有人能够解释一下吗?

2个回答

2

您正在尝试爬取的网站正在使用JavaScript进行倒计时(尝试在Web浏览器中禁用JavaScript,您将看到倒计时将设置为0)。遗憾的是,这使得使用请求库无法爬取

最初的回答:

该网站正在使用JavaScript进行倒计时,这导致使用requests库无法进行爬取


1
你可以自己计算。倒计时的目标结束日期在请求的响应中。你可以获取当前日期时间并计算差异。以下内容中我没有添加小时、分钟,但从秒数转换很容易。
import requests 
from bs4 import BeautifulSoup as bs
import datetime
from dateutil.relativedelta import relativedelta

r = requests.get('https://www.wowclassiccountdown.com/')
soup = bs(r.content, 'lxml')
end = soup.select_one('#fusion-countdown-1')['data-timer']
ends = datetime.datetime.strptime(end, '%Y-%m-%d-%H-%M-%S')
start = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
starts = datetime.datetime.strptime(start, '%Y-%m-%d-%H-%M-%S')
diff = ends - starts
diff

对我来说,还需要考虑9小时的时差。


1
做这件事仍然不能给我完全相同的结果,但我很满意。当涉及到javascript时它变得更加复杂,我没有想到,所以谢谢。编辑:糟糕,忘记添加分钟了,现在它完美地工作,哈哈 - chethe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接