如果请求不能,bs4 可以获取网页的动态内容吗?

Can bs4 get the dynamic content of a webpage if requests can't?

提问人:manos 提问时间:12/12/2020 最后编辑:manos 更新时间:12/12/2020 访问量:1210

问:

所以我之前尝试过 Selenium,现在想测试一下 bs4。我尝试运行以下代码,但作为输出收到。None

res_pewdiepie = requests.get(
    'https://www.youtube.com/user/PewDiePie')
soup = bs4.BeautifulSoup(res_pewdiepie.content, "lxml")
subs = soup.find(id="sub-count")
print(subs)

经过一段时间的研究,我发现请求不会像 YouTube 或 Socialblade 上的子计数那样加载动态内容。有没有办法用 bs4 获取这些信息,或者我是否必须切换回 Selenium 之类的东西? 提前致谢!

python 网页抓取 beautifulsoup python-requests

评论

0赞 Rivered 3/29/2022
有时,如果您查看后台发生的网络交互,则可以发布帖子或向其他域请求以检索信息。在这种情况下,我无法找到解决方法。BS4 加载的页面是同意其条款的页面。也许您需要添加正确的请求标头和 cookie。

答:

3赞 Charalamm 12/12/2020 #1

BeautifulSoup只能解析您提供给它的文本,在本例中为页面源。如果信息不存在,它就无能为力。所以,我相信你必须切换回支持 javascript 的东西。

一些选项:python-selenium requests-html

1赞 Carter Shanklin 12/12/2020 #2

我用飞溅来做这样的事情。您可以在 docker 容器中运行它。您可以根据每个请求调整等待渲染的时间。如果您正在进行任何严肃的爬行,还有一个 scrapy 插件。这是我的一个爬虫的片段,它使用 Docker 在本地运行 Splash。祝你好运。

target_url = "https://somewhere.example.com/"
splash_url = "http://localhost:8050/render.json"
body = json.dumps({"url": target_url, "har": 0, "html": 1, "wait": 10,})
headers = {"Content-Type": "application/json"}

response = requests.post(splash_url, data=body, headers=headers)
result = json.loads(response.text)
html = result["html"]