【问题标题】:Web scraping with Python and beautifulsoup: What is saved by the BeautifulSoup function?使用 Python 和 beautifulsoup 进行网页抓取:BeautifulSoup 函数保存了什么?
【发布时间】:2021-04-07 02:19:10
【问题描述】:

这个问题跟在previous question 后面。我想使用 Python 从博彩网站上抓取数据。我首先尝试关注此tutorial,但问题是该站点tipico 无法从瑞士获得。因此,我选择了另一个博彩网站:Winamax。在本教程中,首先检查网页tipico,以便找到投注率在 html 文件中的位置。在tipico 网页中,它们存储在“c_but_base c_but”类的按钮中。通过编写以下行,可以使用 Beautiful soup 模块保存和打印费率:

from bs4 import BeautifulSoup
import urllib.request
import re

url = "https://www.tipico.de/de/live-wetten/"

try:
 page = urllib.request.urlopen(url)
except:
 print(“An error occured.”)

soup = BeautifulSoup(page, ‘html.parser’)

regex = re.compile(‘c_but_base c_but’)
content_lis = soup.find_all(‘button’, attrs={‘class’: regex})
print(content_lis)

因此,我尝试对网页 Winamax 做同样的事情。我检查了页面,发现投注率存储在“ui-touchlink-needsclick priceodd-price”类的按钮中。请看下面的代码:

from bs4 import BeautifulSoup
import urllib.request
import re

url = "https://www.winamax.fr/paris-sportifs/sports/1/7/4"

try:
    page = urllib.request.urlopen(url)
except Exception as e:
    print(f"An error occurred: {e}")

soup = BeautifulSoup(page, 'html.parser')

regex = re.compile('ui-touchlink-needsclick price odd-price')
content_lis = soup.find_all('button', attrs={'class': regex})
print(content_lis)

问题在于它什么也不打印:Python 找不到 此类类的元素(对吗?)。因此,我尝试打印 soup 对象,以查看 BeautifulSoup 函数到底在做什么。我添加了这一行

print(soup)

打印时(我没有显示汤的打印,因为它太长了),我注意到这与我右键单击“检查”时出现的文本不同"的 Winamax 网页。那么 BeautifulSoup 函数到底在做什么呢?如何使用 BeautifulSoup 存储来自 Winamax 网站的投注率?

编辑:我从来没有用 html 编写过代码,而且我是 Python 的初学者,所以有些术语可能是错误的,这就是为什么有些部分是斜体的。

【问题讨论】:

  • “我注意到这与我右键单击“检查”Winamax 网页时出现的文本不同。”这是您的实际问题,与 BeautifulSoup 无关。在构建爬虫时经常发生这种情况:网站不会向机器人发送相同的响应。尤其是博彩网站,他们当然必须有反​​机器人保护。您在浏览器中看到的网页可能是事后使用 Javascript 编辑的。

标签: python beautifulsoup


【解决方案1】:

这是因为该网站使用JavaScript 来显示这些详细信息,而 BeautifulSoup 本身并不与JS 交互。

首先尝试找出您要抓取的元素是否存在于页面源中,如果存在,您可以抓取,几乎所有内容!在您的情况下,按钮/跨度标签不在页面源中(意味着隐藏或通过脚本拉出)

页面源代码中没有<button> 标记:

所以我建议使用 Selenium 作为解决方案,并且我尝试了对网站的基本抓取。

这是我使用的代码:

from selenium import webdriver

option = webdriver.ChromeOptions()
option.add_argument('--headless')
option.binary_location = r'Your chrome.exe file path'

browser = webdriver.Chrome(executable_path=r'Your chromedriver.exe file path', options=option)

browser.get(r"https://www.winamax.fr/paris-sportifs/sports/1/7/4")

span_tags = browser.find_elements_by_tag_name('span')
for span_tag in span_tags:
    print(span_tag.text)

browser.quit()

这是输出:

此输出中存在一些垃圾数据,但这是为了让您弄清楚您需要什么,不需要什么!

【讨论】:

  • 感谢@Ananth 的回答!但是,在运行您的代码时,我没有得到相同的输出,而是得到了整个 Javascript 网页。我错过了什么吗?
  • 您是否对代码进行了任何更改?除了文件路径的..
  • 对不起,我运行了错误的文件...但是,在运行您的文件时,我收到了一些错误消息,例如:“File”C: (...) Python\Python37\lib\subprocess.py ",第 1172 行,在 _execute_child startupinfo) PermissionError: [WinError 5] Access denied"
  • 在您的代码中,从未使用过“option.binary_location”对象。您应该在第 7 行使用它而不是“r'Your chromedriver.exe file path'”,对吗? (我知道它不会改变任何东西,但想确保我做对了)
  • 如果你有PermissionError,那么两件事。 1) 如果您使用 cmd/terminal 运行文件,则使用 cmd 作为 admin/sudo。 2)您的路径变量(对于驱动程序和浏览器)应该是这样的C:\Program Files\BraveSoftware\Brave-Browser\Application\brave.exe Brave 是我使用的浏览器,所以链接。路径也应该包含 .exe 文件名!。请检查一下并告诉我。
猜你喜欢
  • 2020-08-09
  • 1970-01-01
  • 2020-10-04
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 2018-08-02
相关资源
最近更新 更多