【问题标题】:Web Scraping this site to get the output网页抓取此站点以获取输出
【发布时间】:2019-11-11 11:14:35
【问题描述】:

有这个网站https://colinhume.com/music.aspx 接受某个输入并将其转换为输出文件。

假设输入是:

X: 7
T:As Luck Will Have It
% Nottingham Music Database
S:John Lagden, via EF
M:6/8
K:D
E|"D"F3 "A7/c+"A2G|"Bm"FGF "A7"E3|"D"F2A d2c|"G"BcB "D"A3|"G"G2B "A7"A2G|\
"D"F2A d2f|
"G"efe "E7"dcB|"A7"ABA GFE|"D"F3 "A7/c+"A2G|"Bm"FGF "A7"E3|"D"F2A d2c|
"G"BcB "D"A3|"G"G2B "A7"A2G|"D"F2E "Bm"D2F|"Em"EFG "A7"F2E|"D"D3 -D2||
A|"D"d3 fed|"A"c2d e2A|"Bm"Bcd c2B|"F#m"A3 A2A|"G"B3 dcB|
"D"A2d f2a|"G"agf "E7"fed|"A7"e3 e2A|"D"d3 fed|"A"c2B A2A|
"Bm"B3 dcB|"F#m"A3 A2F|"G"G3 BAG|"D"F2A d2D|"Em"EFG "A7"F2E|"D"D3 -D2||

当您单击“转换”按钮时,会出现一个输出页面,顶部有一个“播放”按钮。当您单击该按钮时,将下载一个 MIDI 文件。

现在,这整个过程是否可以由 python 代码自动完成,它将 midi 文件存储到我的 PC 中?

我需要将此代码作为项目的一部分,该项目应自动将该类型的输入转换为 midi 格式。我试过很多离线代码,似乎都没有正常工作。

所以我希望我可以通过网络抓取来做到这一点。

注意:输入需要采用特定格式,因此请按原样粘贴以上文本。

【问题讨论】:

    标签: python-3.x selenium selenium-webdriver web-scraping midi


    【解决方案1】:

    您需要导入 selenium 模块来运行它。您还需要在您的路径中有chromedriver。自从您提到网络抓取以来,您可能已经这样做了。

    编辑:代码现在不显示 GUI,并将文件下载到 py 脚本的同一文件夹中。

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    import os
    
    options = Options()
    options.add_argument('--headless')
    driver = webdriver.Chrome(chrome_options=options)
    download_path = os.path.dirname(__file__)
    driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
    params = {'cmd':'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': download_path}}
    driver.execute("send_command", params)    
    
    song = """X: 7
    T:As Luck Will Have It
    % Nottingham Music Database
    S:John Lagden, via EF
    M:6/8
    K:D
    E|"D"F3 "A7/c+"A2G|"Bm"FGF "A7"E3|"D"F2A d2c|"G"BcB "D"A3|"G"G2B "A7"A2G|\
    "D"F2A d2f|
    "G"efe "E7"dcB|"A7"ABA GFE|"D"F3 "A7/c+"A2G|"Bm"FGF "A7"E3|"D"F2A d2c|
    "G"BcB "D"A3|"G"G2B "A7"A2G|"D"F2E "Bm"D2F|"Em"EFG "A7"F2E|"D"D3 -D2||
    A|"D"d3 fed|"A"c2d e2A|"Bm"Bcd c2B|"F#m"A3 A2A|"G"B3 dcB|
    "D"A2d f2a|"G"agf "E7"fed|"A7"e3 e2A|"D"d3 fed|"A"c2B A2A|
    "Bm"B3 dcB|"F#m"A3 A2F|"G"G3 BAG|"D"F2A d2D|"Em"EFG "A7"F2E|"D"D3 -D2||"""
    
    driver.get("https://colinhume.com/music.aspx")
    input_element = driver.find_element_by_id("InBox")
    input_element.send_keys(song)
    
    button_element = driver.find_element_by_id("ConvBtn")
    button_element.click()
    
    button_elements = driver.find_elements_by_class_name("Button")
    for button_element in button_elements:
        if button_element.text == "Play":
                driver.get(button_element.find_element_by_tag_name("a").get_attribute("href"))
                break
    

    【讨论】:

    • 另外,是否可以在不让 Chrome 浏览器在 GUI 中显示的情况下做到这一点?
    • 是的,你可以很容易地使用无头行为,但是如果你这样做,下载也需要特殊处理。见stackoverflow.com/questions/52830115/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多