前言: 出于兴趣,这里来做了一个半自动化的抖音视频爬虫,该爬虫可以实现爬取某一用户发布的所有视频。
安装mitmproxy
pip3 install mitmproxy
安装报错
ImportError: cannot import name 'PyAsn1UnicodeDecodeError' from 'pyasn1.error' (d:\anaconda3\lib\site-packages\pyasn1\error.py)
**解决方法:**
**1、先卸载**
C:\Users\lzc>**pip uninstall pyasn1**
Found existing installation: pyasn1 0.4.4
Uninstalling pyasn1-0.4.4:
Would remove:
d:\anaconda3\lib\site-packages\pyasn1-0.4.4-py3.7.egg-info
d:\anaconda3\lib\site-packages\pyasn1\*
Proceed (y/n)? y
Successfully uninstalled pyasn1-0.4.4
**2、重新安装**
C:\Users\lzc>pip install pyasn1
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/pyasn1/
Collecting pyasn1
Using cached pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
ERROR: mitmproxy 5.1.1 has requirement ruamel.yaml<0.17,>=0.16, but you'll have ruamel-yaml 0.15.46 which is incompatible.
Installing collected packages: pyasn1
Successfully installed pyasn1-0.4.8
启动mitmproxy之后,手机网打开网址:mitm.it ,选择匹配的证书下载安装(见下图),然后开启信任证书(设置--通用--关于本机--证书信任设置),就能抓到https的请求了。
运行时发现端口被占用
Python flask OSError[Errno 48]:Address already in use
建立Flask项目filename.py后,运行该项目,报错内容如下:
意思是地址已被使用,搜索相关问题后发现是因为,你曾启动过相同或者类似的服务占用了这个端口(一般来讲,在Mac上直接用Python启动的话,会导致退出不完整,你不能通过点击GUI的“退出”按钮来一步到位,后台的Python进程还是存在的,而它就是一直占用端口不释放的元凶)。
找到的解决办法如下:
1.改掉默认的端口
2.就是杀掉占用端口的程序
第一种方法只能解决当前的问题,后续仍会出现类似的问题
第二种更靠谱一些,具体操作如下
使用lsof命令,全写是list open fail,意为列出当前系统打开文件
我们要找到之前占用的端口5000,所以终端输入的命令为
lsof -i:5000,然后可以看到PID为9108
接下来杀掉这个进程就可以了,在终端输入命令
kill 9108 , 之后重新运行下程序就不会报错了
强杀kill -9 9108
CODE:
import json,os
import requests
def response(flow):
#分析数据发现这是抖音旧的视频请求地址(估计是防爬取定时换的吧)
#url='https://api.amemv.com/aweme/v1/aweme/post/'
url='https://api3-normal-c-lq.amemv.com/aweme/v1/aweme/post/'
#筛选出以上面url为开头的url
if flow.request.url.startswith(url):
text=flow.response.text
#将已编码的json字符串解码为python对象
data=json.loads(text)
#在charles中刚刚看到每一个视频的所有信息
#都在aweme_list中
video_url=data['aweme_list']
print(video_url)
path='G:/Others/Douyin'
#path='D:\crawler_data\douyin'
if not os.path.exists(path):
os.mkdir(path)
for each in video_url:
#视频描述
desc=each['desc']
url=each['video']['play_addr']['url_list'][0]
# print(desc,url)
filename=path+'/'+desc+'.mp4'
# print(filename)
req=requests.get(url=url,verify=False)
with open(filename,'ab') as f:
f.write(req.content)
# 在文件关闭前,将缓存区的内容刷新到硬盘
f.flush()
print(filename,'下载完毕')
执行python脚本
mitmdump -s 脚本路径
Charles分析:
![](https://img.haomeiwen.com/i3327727/a3ae664071f86155.png)
好了的样子:
![](https://img.haomeiwen.com/i3327727/ad9b84aa92987a1b.png)
PS:
1、由于mitmdump自带的包只是基本python库,这里需要将python代码放到python的site-packages文件夹中运行。
2、在刷抖音的过程中,想下载谁的视频,只需要将代码运行着,点谁的用户的主页就可以下载到视频。
3、在模拟器的配置过程中,遇到了配置好mitmproxy证书以后抖音无法正常联网的情况,这里需要搜索一下安卓关闭SSL教程,需要刷xpose框架,和一个什么东西,搜索一下模拟器关闭SSL即可。
————————————————
github地址: https://github.com/xiaobaixz/Douyin_spider
版权声明:本文为CSDN博主「TAF_MT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40258748/article/details/104728673
https://www.cnblogs.com/liangmingshen/p/12375124.html
————————————————
版权声明:本文为CSDN博主「SelinaGu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/SelinaGu/article/details/103732131
网友评论