Python爬虫—【最强兵王】音频爬取

单位的同事喜欢听电子书,抽空写了个脚本,爬取了所有的电子书音频,这样听书比较方便。

电子书网址:最强兵王 福海版

通过 F12 开发者工具,可以清晰地看到网页的结构,先查看 title 所在的位置:

 Python爬虫—【最强兵王】音频爬取_第1张图片

接下来查找音频 audio 所在的位置:

Python爬虫—【最强兵王】音频爬取_第2张图片

 

学习 Python 爬虫,常用的库需要了解一下,如requestsBeautifulSoupselenium等,用起来很方便。

使用这些库,我们很容易就获得 audio 对应的 title src

    base_url = "https://www.ting22.com/ting/659-2.html"
    browser = webdriver.Chrome()
    browser.get(base_url)

    soup = BeautifulSoup(browser.page_source, 'html.parser')
    audio_name = soup.find(name='div', attrs={'class': 'title'}).h1.string
    audio_url = soup.find(name='source', attrs={'id': 'mySource'}).get('src')

    print(audio_name + "  +  " + audio_url)

  以下是程序运行结果:

Python爬虫—【最强兵王】音频爬取_第3张图片

获取到 audio title src,接下来就是保存文件:

    audio_dir = "D:/AudioBook/Test/"

    try:
        urllib.request.urlretrieve(audio_url, audio_dir + audio_name + ".mp3")

    except Exception as e:
        print(e)
        print("Get Audio " + audio_name + " Failed!")

    else:
        print("Get Audio " + audio_name + "Success!")

  看运行结果

Python爬虫—【最强兵王】音频爬取_第4张图片

最后,音频已经保存在本地。

整个流程就清晰了,然后爬取全部的音频,考虑放在一个 for  循环中。

大批量的爬取,网站会有一些反爬虫的限制,所以浏览器 header 标识需要随时切换,对于捕获的一些异常要能够处理。

Python爬虫—【最强兵王】音频爬取_第5张图片

Python爬虫—【最强兵王】音频爬取_第6张图片

以下是源码,供大家参考。

import time
import socket
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
from fake_useragent import UserAgent

def download_audio(audio_name, audio_url):
    socket.setdefaulttimeout(60)

    try:
        audio_dir = "D:/AudioBook/StrongSoldier/"

        user_agent = UserAgent(verify_ssl=False)
        opener = urllib.request.build_opener()
        opener.addheaders = [('User-agent', user_agent.random)]
        urllib.request.install_opener(opener)
        urllib.request.urlretrieve(audio_url, audio_dir + audio_name + ".mp3")

    except socket.timeout:
        print("Download " + audio_name + " Time Out...")
        download_audio(audio_name, audio_url)

    except urllib.error.ContentTooShortError:
        print("Download " + audio_name + " Failed,Reloading...")
        download_audio(audio_name, audio_url)

    else:
        print("Get Audio " + audio_name + " Success!")

    time.sleep(2)


def main():
    base_url = "https://www.ting22.com/ting/659-"

    option = webdriver.ChromeOptions()
    option.add_argument('headless')

    page_start = 1
    page_end = 1775

    for num in range(page_start, page_end):
        page_num = str(num)

        webpage = base_url + page_num + ".html"
        browser = webdriver.Chrome(options=option)
        browser.get(webpage)

        time.sleep(1)
        soup = BeautifulSoup(browser.page_source, 'html.parser')

        audio_name = soup.find(name='div', attrs={'class': 'title'}).h1.string
        audio_url = soup.find(name='source', attrs={'id': 'mySource'}).get('src')
        print(audio_name + "  +  " + audio_url)

        download_audio(audio_name, audio_url)
        browser.quit()


if __name__ == "__main__":
    main()

 

你可能感兴趣的:(Python,Python,爬虫)