记录:(signature的规则更新了,无法获得视频列表数据)
- 使用selenium 生成的sign 和真实的sign有区别
- 怀疑是加密的js里面判断了webdriver,所以改用 firfox的webdriver ----失败
- 既然是需要js生成signature 就在python中引入PyExecJS ----失败 js中一些变量获取不到
- 使用pyppeteer ------ 失败 依然被识别
通过抖音用户主页的分享链接例如:https://v.douyin.com/KhkbCq/ 获取用户的基本信息,如:粉丝数/视频数/视频评论量/视频发布时间/视频点赞数
访问分享链接之后,获取用户的基本信息。抖音id/昵称/点赞数/关注数/粉丝数
分析视频列表接口的规则,生成视频列表访问的url,此url中的signature 需要生成一个html文件,selenium
打开html文件能获取。(见 signature分析.md文件)
在视频列表接口返回的json中 可以拿到 视频的基本信息和视频播放地址
再用requests
访问视频下载地址,下载视频到本地。
此项目使用mongodb 存储数据
- 读需要爬取的抖音用户的分享页链接写在
share_task.txt
中 - 直接运行
run.py
文件
- 读需要爬取的抖音用户的分享页链接写在
share_task.txt
中 - 运行
handle_share.py
获取share_task.txt
配置的抖音用户的基本信息 点赞数/关注数/粉丝数 - 运行
video_list_url.py
获取用户的视频列表信息: 点赞数/关注数/转发数/评论数 - 运行
video_download.py
下载指定用户的所有无水印视频保存到video
文件夹
见 signature分析.md文件
Q:Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
A: 使用 ChromeDriverManager 去下载对应chrome版本的 ChromeDriver
pip install webdriver-manager
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
Q: signature.html
总是不能正确拿到视频列表的接口url
A:使用selenium 和正常打开的浏览器生成的sigenature不一样。 有可能是 在js代码中判别了浏览器的原因。 如何突破网站对selenium的屏蔽
方法一:想到js中删除相关关键词,但是js代码都混淆加密过了。不可行
方法二:把selenium浏览器伪装成真实浏览器,还是和真是signature有出入不可行
如何正确移除Selenium中window.navigator.webdriver的值
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)
使用这个方法,生成的signature selenium 中生成的结果: Q94FRRAeHXEwKA8qaryWr0PeAV
正常浏览器的结果: Q94FRRAeHXEwKA8qaryWr0PeBV
目前只剩倒数第二位的数值是相差1的结果。
见video_list_url.py
中get_video_list_url()
方法
Q:urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=62785): Max retries exceeded with url: /session/8a9ff6e4be66e9833b0a16750c5fe67e/url (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x110acd7c0>: Failed to establish a new connection: [Errno 61] Connection refused')) A:....好像ip被封了。要找代理了
Q:request 配置代理的时候报错:urllib3.exceptions.ProxySchemeUnknown: Not supported proxy scheme None A:
proxies = {
"http":'http://' + ip_list.get_http_ip(),
"https": 'https://' +ip_list.get_https_ip()}
格式需要是 http:// + ip + :端口
Q:Message: 'chromedriver' executable needs to be in PATH A: windows.解决方法 mac 解决方法