使用python(美丽的汤)在点击问题上进行网页抓取

时间:2019-12-21 19:36:40

标签: python web-scraping beautifulsoup onclick

我在这里很新,很乐意得到一些帮助。我正在尝试从网站https://www.boerse.de/indizes/Dax/DE0008469008收集数据。在此网站上列出了Dax30公司。我想收集每个公司从2000年3月到2019年的所有股价。因此,我需要单击公司名称。在下一页上有一个按钮“ Historie”。加载该页面后,出现带有股票价格的页面。有一个列表,其中包含每月的股票价格。这是第二个表,称为“ Adidas Monats-Schlusskurse 2019”。当我在3月“März”上单击此按钮时,将出现一个新表“ Adidas Monats-Schlusskurse”,其中包含所有3月的股票价格。我正在使用python和beautifulsoup。我的问题是由于onclick html语法的原因,我无法到达“ Adidas Monats-Schlusskurse”表。我设法找到正确的href =#,但这不是链接,所以我无法访问想要的表。下面是我的代码:

import bs4
from urllib.request import urlopen as ureq
from bs4 import BeautifulSoup as soup

my_url = 'https://www.boerse.de/indizes/Dax/DE0008469008'
uclient = ureq(my_url)
page_html = uclient.read()
uclient.close()

page_soup = soup(page_html, "html.parser")

aktien = page_soup.findAll("a",{"class":"nobr"})

for aktie in aktien:
    name = aktie.text                                                   #getting the name of the company

    historie = aktie["href"]                                            #getting the link and then open next website
    hclient = ureq(historie)
    h_html = hclient.read()
    hclient.close()
    hpage_soup = soup(h_html, "html.parser")

    block = hpage_soup.find("div",{"class":"col-sm-2 navColumn"})
    link = "https://www.boerse.de" + block.findAll("a")[1].get("href")  #getting the link Historie

    kclient = ureq(link)
    k_html = kclient.read()
    kclient.close()
    kpage_soup = soup(k_html, "html.parser")                            #open website with stock prices

    kurs = kpage_soup.find("div", {"id": "histKurseMonth"})
    button = kurs.findAll("a")[2].get("href")                           #getting the link for the website with stock prices for march
                                                                        #problem href="#" onclick="historieMonatJahr('DE0007472060', '3', '');return false;"
                                                                        #what do I need to do to get to the stock prices for march?
                                                                        #Don't know what to do with onclick

感谢您的帮助。

编辑:

多亏了Andrej Kesely,我得到了我想要的东西,但是有人能理解我的代码并且可以告诉我如何使用我的代码吗?我只需要帮助即可克服点击页面上的问题。因此,当有人只能添加代码才能进入市场时,这会很好,因为我想自己学习编程,而不希望交付解决方案。

1 个答案:

答案 0 :(得分:0)

该页面正在执行POST请求,并通过JavaScript / JSON动态加载月份数据。

但是,当您检查(在Firefox / Chrome开发人员工具中)页面连接的位置时,您也可以通过请求获取数据。

此示例将获取每个公司和第3个月(3月)的数据,并以表格形式打印:

import requests
from bs4 import BeautifulSoup

dax_url = 'https://www.boerse.de/indizes/Dax/DE0008469008'
url = 'https://www.boerse.de/ajax/historie.php'

data = {'isin': '',
        'monat': 1,
        'jahr': ''}

soup = BeautifulSoup(requests.get(dax_url).text, 'html.parser')
isin = [tr['id'] for tr in soup.select('#pushList tr[id]')]

for i in isin:
    data['isin'] = i
    data['monat'] = 3  # 3 - only March
    soup = BeautifulSoup(requests.post(url, data=data).json() , 'html.parser')
    company = soup.h2.get_text(strip=True).replace(' Monats-Schlusskurse', '')

    for tr in soup.select('.tablesorter tbody tr'):
        monat, erster, schluss, hoch, tief, *_ = tr.get_text(separator='|', strip=True).split('|')
        if int(monat.split()[-1]) < 2000:
            continue
        print('{:<30} {:<20} {:<20} {:<20} {:<20} {:<20}'.format(company, monat, erster, schluss, hoch, tief))

打印:

Adidas                         März 2019            214,50               216,60               219,80               197,25              
Adidas                         März 2018            181,70               196,65               200,30               168,25              
Adidas                         März 2017            157,40               178,30               185,05               157,35              
Adidas                         März 2016            98,58                103,00               104,75               95,17               
Adidas                         März 2015            69,38                73,69                75,10                66,80               
Adidas                         März 2014            82,20                78,54                83,49                74,76               
Adidas                         März 2013            69,85                80,94                83,10                69,70               
Adidas                         März 2012            58,33                58,54                60,29                55,52               
Adidas                         März 2011            46,84                44,46                48,15                42,60               
Adidas                         März 2010            36,60                39,60                40,88                35,20               
Adidas                         März 2009            22,41                25,06                26,79                22,37               
Adidas                         März 2008            41,40                42,11                42,94                38,23               
Adidas                         März 2007            37,30                40,93                41,24                34,50               
Adidas                         März 2006            41,10                40,80                41,87                38,43               
Adidas                         März 2005            28,38                30,61                30,61                27,88               


... and so on.