【问题标题】:Tables scapping on Multiple Pages of website with Single URL with Python [closed]使用 Python 在具有单个 URL 的网站的多个页面上生成表格 [关闭]
【发布时间】:2021-09-02 10:27:58
【问题描述】:

我正在尝试从 ccil 网站抓取数据。这些表被分成不同的页面,但所有页面都使用相同的 url。我正在使用 pandas 和 BeautifulSoup 来解析 HTML 代码,我只能抓取初始表,但我想要所有表中的全部数据。

请注意,此网站显示特定时间的数据。

我的链接是:-https://www.ccilindia.com/OMMWSG.aspx

我在stackoverflow上也看到过类似的查询,程序也在运行,但我不明白“数据”部分是从哪里获取的。

Scrape Tables on Multiple Pages with Single URL

【问题讨论】:

  • 我投票结束这个问题,因为该网站的隐私政策规定“本网站上的任何信息,包括文本和图形,都不得以任何形式复制或传播。是指未经 CCIL 的明确书面同意”,您试图违反此规定。
  • 请停止编辑您的标题!
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已根据 CC BY-SA license 授予 SE 分发内容的不可撤销权利(即无论您未来的选择如何)。根据 SE 政策,分发非破坏版本。因此,任何破坏行为都将被撤销。请参阅:How does deleting work? …。如果允许删除,则帖子下方左侧有一个“删除”按钮,但仅在浏览器中,而不是移动应用程序中。

标签: python


【解决方案1】:

我编写了一个简单的Selenium 脚本来抓取表格数据并浏览页面。

from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path="<PATH TO YOUR CHROMEDRIVER>")
url = "https://www.ccilindia.com/OMMWSG.aspx"
driver.get(url)

time.sleep(2)

# This dictionary will hold all the data for each page.
row_info = {}

def next_page(page):
    if page == 1:
        next_page = driver.find_element_by_xpath("/html/body/form/table[5]/tbody/tr[1]/td/table/tbody/tr[27]/td/a[1]")
    elif page == 2:
        print("Moving to last page")
        next_page = driver.find_element_by_xpath("/html/body/form/table[5]/tbody/tr[1]/td/table/tbody/tr[27]/td/a[2]")
    else:
        print("Last page reached, closing...")
        return None
    webdriver.ActionChains(driver).move_to_element(next_page).click().perform()


for page in range(1,4):
    print("Current page:", page)

    # After trial and error,
    # I found that these elements contain all the required data in a single page
    table_row = driver.find_elements_by_tag_name("tr")[5]
    td = table_row.find_elements_by_tag_name("td")[0].text

    # Creates a dictionary Key for current page and adds table data as Value
    row_info[f"page_{page}"] = td

    time.sleep(2)
    next_page(page)
    time.sleep(2)

print("---")
print(row_info["page_1"])
print("---")
print(row_info["page_2"])
print("---")
print(row_info["page_3"])

driver.close()

保存到每个字典条目的数据没有格式化,因此每个页面都会有这样的内容:

Security Description Maturity Date Bid Amt. (Cr.) Bid Yield Bid Price Offer Price Offer Yield Offer Amt. (Cr.) LTP LTY LTA TTA (Cr.)
08.26 MH SDL 2029 02/01/2029 0.00 0.0000 0.0000 0.0000 0.0000 0.00 109.0500 6.6761 5.00 5.00
08.57 HR SDL 2028 04/07/2028 0.00 0.0000 0.0000 0.0000 0.0000 0.00 110.3950 6.6501 5.00 5.00
08.35 GJ SDL 2029 06/03/2029 0.00 0.0000 0.0000 0.0000 0.0000 0.00 109.7000 6.6856 5.00 5.00
08.37 TN SDL 2029 06/03/2029 0.00 0.0000 0.0000 0.0000 0.0000 0.00 110.0500 6.6479 5.00 5.00
08.38 GJ SDL 2029 27/02/2029 0.00 0.0000 0.0000 0.0000 0.0000 0.00 109.8500 6.6853 5.00 5.00
1 2 3

最后一行1 2 3 是包含的页码。因此,您必须自己对其进行格式化以满足您的需求。

【讨论】:

  • 如何在没有硒的情况下做到这一点?并且只是通过使用美丽的汤,请求和熊猫..在我给出的另一个链接中,没有使用硒......还有如何安装网络驱动程序?
  • 不幸的是,如果实际的 url 没有指向不同的页面,我不知道如何浏览带有 requests 库的链接。所以,我只能提供Selenium 解决方案。您可以下载 Chrome 网络驱动程序here。请务必选择与您的 Chrome 浏览器版本相对应的版本。
  • 是的,您的程序运行顺利,非常感谢。但是我的 crome 浏览器设置和网页也保持打开状态,获取数据后如何关闭浏览器? , 另外如何正确拟合数据?我试过没有结果...我也在尝试增加页面,因为在程序中有 3 页,我已经复制粘贴了 15-20 页.. 找不到页面时如何处理错误?
  • 要增加页面,您需要为每个页面添加另一个elif 语句到next_page 函数以及它们各自的XPath 位置,例如elif page == 6: 然后next_page = driver.find_element_by_xpath("/html/body/form/table[5]/tbody/tr[1]/td/table/tbody/tr[27]/td/a[6]")。为了使其正常工作,您需要使用开发人员工具手动复制每个 XPath。 Step1, Step 2 请注意,在复制第 n 页的 XPath 之前,您需要位于第 n-1 页。因此,要复制链接 6,请确保您位于第 5 页以确保其正常工作
  • 另外,您需要将for 循环增加到您正在抓取的页面数量。它目前是 3 页,所以它是(1, 4)。如果你将它用于一个有 10 页的表格,它应该是(1, 11)
猜你喜欢
  • 2021-04-18
  • 2017-06-13
  • 2020-07-31
  • 1970-01-01
  • 2018-02-21
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多