哔哩哔哩视频爬取源码分享

背景:

无意间发现B站有个老师的课程特别好(python教学的视频),单位的网络限制了视频网站访问,所以尝试着去把视频下载保存起来,经过一段时间的研究终于完成代码的开发,大家有需要的可以搞下来,后续我会进行一个延伸优化,争取做到通过前端页面的视频名称输入作为爬取条件进行下载。

第一版;2021年02月23日

第一版;2021年02月24日

解决间歇不触发点击保存按钮的问题

#_author_='Lucky';<br></br>#date:  2021/2/18
import time<br></br><br></br>from pywinauto import application<br></br>from selenium import webdriver<br></br>from selenium.webdriver.common.action_chains import ActionChains<br></br><br></br><br></br>def chrome_options_setting(web_driver):<br></br>    """<br></br>    设置 Chrome Browser 的下载前询问每个文件的保存位置选项为打开(true)<br></br>    :param web_driver: 浏览器驱动<br></br>    :return: None<br></br>    """<br></br>    web_driver.get("chrome://settings/downloads")<br></br>    time.sleep(2)<br></br>    web_element = web_driver.find_element_by_xpath("//settings-ui")<br></br>    shadowRoot = web_driver.execute_script("return arguments[0].shadowRoot", web_element)<br></br>    # shadowRoot 节点下不能使用 xpath 选择器<br></br>    web_element = shadowRoot.find_element_by_id("container").find_element_by_id("main")<br></br>    shadowRoot = web_driver.execute_script("return arguments[0].shadowRoot", web_element)<br></br>    web_element = shadowRoot.find_element_by_css_selector("settings-basic-page[role='main']")<br></br>    shadowRoot = web_driver.execute_script("return arguments[0].shadowRoot", web_element)<br></br>    web_element = shadowRoot.find_element_by_css_selector("settings-downloads-page")<br></br>    shadowRoot = web_driver.execute_script("return arguments[0].shadowRoot", web_element)<br></br>    web_element = shadowRoot.find_element_by_css_selector("settings-toggle-button")<br></br>    shadowRoot = web_driver.execute_script("return arguments[0].shadowRoot", web_element)<br></br>    result = shadowRoot.find_element_by_css_selector(<br></br>        "#outerRow > cr-toggle[aria-describedby='sub-label-text']").get_attribute("aria-pressed")<br></br>    if result == "false":<br></br>        shadowRoot.find_element_by_css_selector("#outerRow > cr-toggle[aria-describedby='sub-label-text']").click()<br></br><br></br><br></br>def file_name_save(url, xpath):<br></br>    bili_browser.get(url)<br></br>    time.sleep(3)<br></br>    file_name = bili_browser.find_element_by_xpath(xpath).text<br></br>    print(file_name)<br></br>    return file_name<br></br><br></br><br></br>def save_as_window(file_name):<br></br>    app = application.Application().connect(title_re=u"另存为", class_name="#32770")<br></br>    save_as_spec = app.window(title=u"另存为", class_name="#32770")<br></br>    # print(save_as_spec.print_control_identifiers())<br></br><br></br>    edit = save_as_spec["Edit"]<br></br>    edit.set_text(file_name)  # 第一种方法是直接设置edit的text<br></br>    # edit.type_keys(file_name_save(), with_spaces=True)  # 第二种是在里面模拟键盘输入(如果字符串中没有空格,可以省略后面的参数),殊途同归<br></br><br></br> while True:<br></br>        time.sleep(1)<br></br>        app['另存为']['保存(&S)'].click()<br></br>        if app.window(title=u"另存为", class_name="#32770").exists() is False: break<br></br><br></br><br></br>def main_download(url):<br></br>    bili_browser.get("https://xbeibeix.com/api/bilibili")<br></br>    time.sleep(3)<br></br>    bili_browser.find_element_by_xpath("//*[@placeholder='输入地址']").clear()<br></br>    time.sleep(1)<br></br>    bili_browser.find_element_by_xpath("//*[@placeholder='输入地址']").send_keys(url)<br></br>    time.sleep(1)<br></br>    bili_browser.find_element_by_id('button-1').click()<br></br>    time.sleep(2)<br></br>    element2 = bili_browser.find_element_by_xpath("//a[contains(text(),'MP4地址')]")<br></br>    ActionChains(bili_browser).key_down(u'\ue00a').click(element2).perform()<br></br>    ActionChains(bili_browser).key_up(u'\ue00a')<br></br><br></br><br></br>if __name__ == "__main__":<br></br>    bili_browser = webdriver.Chrome()<br></br>    bili_browser.maximize_window()<br></br><br></br>    # 设置Chrome浏览器下载前询问每个文件的保存位置选项<br></br>    chrome_options_setting(web_driver=bili_browser)<br></br>    time.sleep(2)<br></br><br></br>    for index in range(456, 634):<br></br>        video_url = 'https://www.bilibili.com/video/BV197411G75w?p=' + str(index)<br></br>        file_name_xpath = '//*[@id="multi_page"]/div[2]/ul/li[%d]/a/div/div[1]/span[2]' % index<br></br><br></br>        video_name = file_name_save(url=video_url, xpath=file_name_xpath)<br></br>        print(file_name_xpath)<br></br>        # 处理Windows10 系统“另存为”窗口,并修改保存文件名称<br></br>        main_download(video_url)<br></br>        time.sleep(1)<br></br><br></br>        save_as_window(file_name=video_name)<br></br>        time.sleep(3)<br></br><br></br>    time.sleep(5)<br></br>    bili_browser.quit()

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。