【问题标题】:Can bs4 get the dynamic content of a webpage if requests can't?requests 获取不到网页的动态内容,bs4 能获取吗?
【发布时间】:2022-12-20 17:19:11
【问题描述】:

所以我之前尝试过 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 这样的东西? 提前致谢!

【问题讨论】:

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

标签: python web-scraping beautifulsoup python-requests


【解决方案1】:

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

一些选项: python-selenium requests-html

【讨论】:

    【解决方案2】:

    我使用 splash 来处理这样的事情。您可以在 docker 容器中运行它。您可以根据每个请求调整等待渲染的时间。如果你正在做任何认真的爬行,还有一个 scrapy 插件。这是我的一个爬虫的 sn-p,使用 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"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2017-08-29
      • 2021-10-30
      相关资源
      最近更新 更多