# 某音爬虫 **Repository Path**: yang230147961/a-sound-crawler ## Basic Information - **Project Name**: 某音爬虫 - **Description**: 某音刚上线网页版,中午无聊写了个爬虫 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2021-06-22 - **Last Updated**: 2025-07-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 起因 中午边吃饭边刷手机,突然刷到某音刚上线了网页版 [**某音网页版**](https://www.douyin.com/),打开一看,好家伙,这不是抄.... 额,不,借鉴的油管么,就想着网站刚上线,肯定有没有那么强的反扒机制,撸个爬虫玩玩吧 #### 目标网站 > [某音PC网页版](https://www.douyin.com/) #### 代码仓库 开源地址:[某音爬虫](https://gitee.com/yang230147961/a-sound-crawler.git) #### 实现方案 主要使用Python3实现 * requests 用来获取网页html代码,下载视频等 * re 使用正则表达式从html中匹配链接等 * selenium 由于视频页有动态数据,采用selenium方案获取加载后的数据 需要配合浏览器驱动使用 #### 实现过程 一、请求一个列表页,获取到html,匹配出页面中全部详情页链接,生成链接池 二、原本想从链接池中取出详情页地址,请求详情页html,从中匹配出视频资源地址,进入视频池,但是测试后发现由于视频资源链接为动态获取,直接`requests.get`拿不到视频地址,于是采取了第二种方案,使用`selenium`调起浏览器来加载页面,加载完成后使用`xpath`定位到视频资源位置,提取资源链接进入视频池 三、从视频池中取出资源地址,下载保存到本地 四、到这里基本功能已经实现,代码执行中发现,链接池只能获取到10个链接,只能下载10个视频,检查后发现是列表页有懒加载功能,每次翻页到底部才能加载出下一页列表 五、到这里已经有了解决思路,只要我们自动翻页,一直翻到最后,加载完全部列表在去抓取链接池就可以了,此处使用`selenium`插入JS,操作翻页,然后运行代码,发现还是获取不到完整的链接池,只能获取到最后两页的,猜测可以是做了优化,翻过去的列表被移除了 六、这也好解决,我们只要在每次翻页的时候去获取一次链接池就,当翻页完成就可以获取到完整链接了,这样又诞生了一个新的问题,就是会获取到重复的链接,只要在翻页完成时,转换下数据类型,去重就可以了 七、然后就可以快乐的爬视频了 看起来上面说的不少,实际上只需要五十行左右代码就可以实现 #### 具体代码如下 ```python import requests import re from selenium import webdriver import time from contextlib import closing def get_home_ulrs(url): browser = webdriver.Chrome(); browser.get(url) num = browser.find_element_by_xpath( '//*[@id="root"]/div/div[2]/div/div[4]/div[1]/div[1]/div[1]/span').text num = int(int(num)/15)+1 urls = [] for i in range(num): newList = re.findall('https\:\/\/www\.douyin\.com\/video\/[\d]*\?previous_page\=', browser.page_source) urls = [*urls,*newList] browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') time.sleep(2) print(urls) print(set(urls)) mainList =set(urls) browser.close() return mainList def get_video(url): browser = webdriver.Chrome(); browser.get(url) html = browser.find_element_by_xpath( '//*[@id="root"]/div/div[2]/div[1]/div[1]/div[1]/div[1]/div/div[1]/div[2]/video/source[1]') video_url = html.get_attribute('src') browser.close() return video_url def download(url, name): with closing(requests.get(url=url, verify=False, stream=True)) as res: with open('video/{}.mp4'.format(name), 'wb') as fd: for chunk in res.iter_content(chunk_size=1024): if chunk: fd.write(chunk) if __name__ == '__main__': url = input('请输入个人主页地址') print('正在获取视频地址') urls = get_home_ulrs(url) print(urls) print('成功获取{}个,开始下载'.format(len(urls))) index = 1 for url in urls: video_url = get_video(url) print('正在下载{}/{}'.format(len(urls),index)) download(video_url, index) print('下载完成') index += 1 ``` #### 总结 本次爬站没有什么太大的障碍,没有什么复杂的反扒机制,没啥可说的.... 另外问下,这够判几年...