【问题标题】:How to extract a table from website without specifying the web browser in python如何在不指定 python 浏览器的情况下从网站中提取表格
【发布时间】:2022-08-19 03:14:48
【问题描述】:

我正在尝试通过编写 Web 抓取 python 脚本并将其部署在 Azure Databrick 中,自动将 ASX (https://www.asxenergy.com.au/futures_nz) 网站的数据提取到我的数据库中。目前,我的脚本在 Visual Studio Code 中运行,但是当我尝试在 databrick 中运行它时,它崩溃了,并抛出了下面的错误。

Could not get version for google-chrome with the command: google-chrome --version || google-chrome-stable --version || google-chrome-beta --version || google-chrome-dev --version

我相信我需要简化我的代码才能在不提及我们浏览器的情况下获取表格。

我的示例代码如下:

import time
from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import pandas as pd
import sys
from datetime import datetime
from webdriver_manager.chrome import ChromeDriverManager

options = webdriver.ChromeOptions()
options.add_argument(\'headless\')
browser = webdriver.Chrome(ChromeDriverManager().install())
#browser = webdriver.Chrome(\'C:/chromedriver\',options=options)  # Optional argument, if not specified will search path.
browser.get(\'https://www.asxenergy.com.au/futures_nz\')
time.sleep(3)
html = browser.page_source
soup = BeautifulSoup(html,\'html.parser\')
market_dataset = soup.find_all(attrs={\'class\':\'market-dataset\'})
market_dataset

我尝试改用下面的代码,只使用request 包,但它失败了,因为它找不到\'market-dataset\'div class

import time
from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import pandas as pd
import sys
from datetime import datetime
from webdriver_manager.chrome import ChromeDriverManager


URL = \"https://www.asxenergy.com.au/futures_nz\"
page = requests.get(URL)

soup = BeautifulSoup(page.content, \"html.parser\")
market_dataset = soup.findAll(\"div\",href=True,attrs={\'class\':\'market-dataset\'})

谁能帮帮我吗。

  • 您可以在没有浏览器的情况下抓取原始 HTML,但该 HTML 必须包含您想要的数据。如果它是通过 Javascript 动态加载的,那么您要么需要更深入地挖掘并找出它从哪里获取数据,要么您确实需要使用无头浏览器,然后您还需要在 Azure 上安装该浏览器。
  • 它使用 JavaScript 从asxenergy.com.au/futures_nz/dataset 加载数据
  • 你的 findAll(\"div\",href=True, ... 试图找到 <div href=\"...\"> 但这个页面没有

标签: python html web-scraping request screen-scraping


【解决方案1】:

此页面使用 JavaScript 从https://www.asxenergy.com.au/futures_nz/dataset 加载表格

服务器检查它是否是 AJAX/XHR 请求,因此它需要标头

 'X-Requested-With': 'XMLHttpRequest' 

但是你的 findAll("div",href=True, ... 试图找到 <div href="..."> 但这个页面没有 - 所以我用 class="market-dataset" 搜索普通的 <div>


最少的工作代码。

import requests
from bs4 import BeautifulSoup

headers = {
#    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0', 
    'X-Requested-With': 'XMLHttpRequest'     
}

URL = "https://www.asxenergy.com.au/futures_nz/dataset"
response = requests.get(URL, headers=headers)

soup = BeautifulSoup(response.content, "html.parser")
market_dataset = soup.findAll("div", attrs={'class':'market-dataset'})
print('len(market_dataset):', len(market_dataset))

结果:

len(market_dataset): 10

【讨论】:

    【解决方案2】:

    这可能对您有帮助: [在没有无头浏览器的情况下使用 Python 构建 JavaScript Table Web Scraper][1]

    最初发表于:

    在没有无头浏览器的情况下使用 Python 构建 JavaScript Table Web Scraper - ScraperAPI (https://www.scraperapi.com/blog/scrape-javascript-tables-python/)

    Web 表格是 Web 上最大的数据来源之一。它们已经具有易于阅读和理解的格式,并用于显示大量有用信息,例如员工数据、统计数据、原始研究模型等。

    也就是说,并不是所有的表都是一样的,有些表使用传统技术很难刮掉。

    在本教程中,我们将了解 HTML 和 JavaScript 表格之间的区别,为什么后者更难抓取,我们将创建一个脚本来规避渲染表格的挑战,而无需使用任何高度复杂的技术。

    目录:(全文见以上链接)

    什么是 JavaScript 表?

    Web Scraping 中的 HTML 表与 JavaScript 表

    使用请求在 Python 中抓取动态表

    1. 查找隐藏的 API 以访问 JSON 数据

    2. 发送我们的初始 HTTP 请求

    3. 读取和抓取 JSON 数据

    4. 将我们的数据导出到 CSV 文件

    5. 运行我们的脚本 [完整代码]

      总结:使用 ScraperAPI 扩展您的 Scraper

      快乐刮!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2019-04-27
      • 1970-01-01
      相关资源
      最近更新 更多