【问题标题】:Is this site not suited for web scraping using beautifulsoup?这个网站不适合使用 beautifulsoup 进行网页抓取吗?
【发布时间】:2021-01-25 15:31:31
【问题描述】:

我尝试使用 beautifulsoup 来获取以下网站上每场比赛的赔率:

https://danskespil.dk/oddset/sports/category/990/counter-strike-go/matches

我们的目标是最终得到某种包含以下内容的文本文件:

Match1, Team1, team1 获胜赔率, Team2, team2 获胜赔率

Match2, Team1, team1 获胜赔率, Team2, team2 获胜赔率

等等……

我是 beautifulsoup 的新手,所以事情在非常初级的时候就已经出错了。我的方法是“遍历”html 树,直到我到达一个 div 标签,在那里我可以看到所有匹配项都包含在内。这在使用 class="sgd-wrapper" 命中 div 标签之前效果很好,下面有一个链接可以查看图片以进行说明。

This picture is for clarification.

以下是我的代码,m1 和 m2 都不起作用。 Python 只是没有响应。

from bs4 import BeautifulSoup as bs
import requests as res

#Load the webpage content
r = res.get('https://danskespil.dk/oddset/sports/category/990/counter-strike-go/matches').text

#Convert to a beautiful soup object
soup = bs(r,'lxml')

m1 = soup.find("div", attrs={"id": "wrapper"}).find("div", attrs={"class": "page-box"}).find("div", attrs={"class": "page-area"}).find("div", attrs={"id": "oddset-nashville"}).find("div", attrs={"class": "sgd-wrapper"})
m2 = soup.find("div", attrs={"class": "sgd-wrapper"})

如果我删除 m1 中的最后一个查找或重新定义 m2

m1 = soup.find("div", attrs={"id": "wrapper"}).find("div", attrs={"class": "page-box"}).find("div", attrs={"class": "page-area"}).find("div", attrs={"id": "oddset-nashville"})
m2 = soup.find("div", attrs={"id": "oddset-nashville"})

然后我得到响应

print(m1)
<div data-digital-portal-loader-url="https://assets.sb.danskespil.dk/front-end/digitalPortal.js?noCache=20201011001813" id="oddset-nashville"></div>

谁能解释一下为什么这个 div class="sgd-wrapper" 如此特别?

【问题讨论】:

  • 页面是动态生成的,所以看看使用 selenium 来 scape 这个站点。不要使用 Inspect 查看具有不同 HTML 的 View Source。

标签: python html web-scraping beautifulsoup python-requests


【解决方案1】:

问题在于r = res.get('https://danskespil.dk/oddset/sports/category/990/counter-strike-go/matches').text

Python requests 库只是将您的 HTTP/HTTPS 请求发送到服务器并获取原始 html,它并不能帮助您加载更多资源,例如图片和脚本,这意味着某些元素是在 javascript 脚本中操作的(例如,创建一个元素,设置类名并插入到 DOM 树中):

另一个例子,如果你通过请求GETmain.html,它不会加载main.js并且div的类t1不会被设置为sgd-wrapper

# main.html
<html>
   <body>
      <div id="t1"></div>
      <script src="main.js"></script>
   </body>
</html>

# in main.js
document.querySelector('#t1').classList.add('sgd-wrapper');

您需要做的是使用无头 Chrome(如 google-chorme --headless 启动 Chrome)并使用 Chrome API 挂钩页面加载事件,然后转储整个完整内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2020-10-04
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多