骚神视频实战教学代码
第一课 控制浏览器
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium
# 连接浏览器并获取浏览器对象
browser = Chromium()
# 获取标签页对象并打开网址
tab = browser.new_tab('https://www.baidu.com')
input('Press any key to quit')
第二课 浏览器启动配置
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium
from DrissionPage import ChromiumOptions
# 创建浏览器启动配置对象
options = ChromiumOptions()
# 配置浏览器启动选项
options.set_browser_path(r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe') # 设置浏览器路径
options.ignore_certificate_errors() # 忽略证书错误
options.no_imgs() # 禁用图片
options.headless(False) # 无头模式
options.set_local_port(9696) # 设置浏览器debug端口
# 更多配置请参考 http://drissionpage.cn/browser_control/browser_options
# 连接浏览器并获取浏览器对象
browser = Chromium(options)
# 获取标签页对象并打开网址
tab = browser.new_tab('https://www.baidu.com')
input('Press any key to quit')
第三课 操作标签页
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium
# 连接浏览器并获取浏览器对象
browser = Chromium()
# 获取标签页对象并打开网址
tab1 = browser.new_tab('https://www.baidu.com')
tab2 = browser.new_tab('https://www.bing.com')
tab3 = browser.latest_tab
print(tab1.title)
print(tab2.title)
print(tab3.title)
print(browser.latest_tab.title)
browser.latest_tab.close() # 关闭最新的标签页
# 标签页没有Selenium所谓的焦点的概念,多个标签页可以并行操作,所以可以多线程同时打开多个标签页
from concurrent.futures import ThreadPoolExecutor
def open_url(browser,url):
browser.new_tab(url)
chinese_websites = [
"https://www.taobao.com", # 淘宝
"https://www.tmall.com", # 天猫
"https://www.jd.com", # 京东
]
# 使用线程池
with ThreadPoolExecutor(max_workers=3) as executor:
for url in chinese_websites:
executor.submit(open_url, browser,url)
input('请按任意键继续')
第四课 元素定位之普通定位
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
# 骚神网 https://wxhzhwxhzh.github.io/saossion_code_helper_online/
from DrissionPage import Chromium
# 连接浏览器并获取浏览器对象
browser = Chromium()
# 获取标签页对象并打开网址
tab = browser.new_tab('https://www.baidu.com')
wenku_button=tab.ele('文库') #最简单
wenku_button.click()
input_box=tab.ele('@id=kw') #最常用
input_box.input('1234')
search_button=tab.ele('tag:input@@type=submit@@id=su@@value=百度一下') #最精确
search_button.click()
第五课 元素定位之iframe定位
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
# 骚神网 https://wxhzhwxhzh.github.io/saossion_code_helper_online/
from DrissionPage import Chromium
# 连接浏览器并获取浏览器对象
browser = Chromium()
# 获取标签页对象并打开网址
tab = browser.new_tab('https://drissionpage.cn/demos/iframe_diff_domain.html')
iframe = tab.get_frame('t:iframe') #最规范
ele = iframe.ele('网易首页')
print(ele)
iframe = tab.ele('t:iframe') #最简洁
ele = iframe('网易首页')
print(ele)
iframe = tab.eles('t:iframe')[0] # 成功率最高
ele = iframe('网易首页')
print(ele)
第六课 元素定位之shadow root 定位
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
# 骚神网 https://wxhzhwxhzh.github.io/saossion_code_helper_online/
from DrissionPage import Chromium
# 连接浏览器并获取浏览器对象
browser = Chromium()
# 获取标签页对象并打开网址
tab = browser.new_tab('https://spiderapi.cn/captcha/turnstile-managed/')
不知名的p=tab.ele('@id=cf-wait')
不知名的div=不知名的p.after(1)
print(不知名的div.html)
iframe_ele=不知名的div.sr("t:iframe")
print(iframe_ele)
第七课 元素定位之Xpath定位
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium
# 连接浏览器并获取浏览器对象
browser = Chromium()
# 获取标签页对象并打开网址
tab = browser.new_tab('https://ahrefs.com/backlink-checker/?input=baidu.com&mode=subdomains')
xpath ='x://*[@id="root"]/div[1]/section[1]/div/div/div/div/div/div[2]/div[2]/div[2]/form/div[1]/div/div'
div元素=tab.ele(xpath)
print(div元素)
input('Press any key to quit')
第八课 提取元素信息
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium
# 连接浏览器并获取浏览器对象
browser = Chromium()
# 获取标签页对象并打开网址
tab = browser.new_tab('https://baidu.com/')
AI助手元素=tab.ele('@id=csaitab')
print(AI助手元素.text)
print(AI助手元素.link)
print(AI助手元素.attr("class"))
print(AI助手元素.html)
print(AI助手元素.rect.viewport_midpoint)# 视口坐标
print(AI助手元素.rect.screen_location) # 屏幕坐标
baidu_logo = tab.ele('@id=s_lg_img')
baidu_logo.save(name='baidu_logo') # 保存图片元素到当前目录下
input('Press any key to quit')
第九课 鼠标操作验证码
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium,ChromiumOptions
options=ChromiumOptions().use_system_user_path()
# 连接浏览器并获取浏览器对象
browser = Chromium(options)
# 获取标签页对象并打开网址
tab = browser.new_tab('https://dun.163.com/trial/sense')
tab.wait(1)
tab.ele('可疑用户-滑动拼图').click()
tab.ele('点击完成验证').click()
滑块_xpath='x:/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[2]/div/div/div[2]/div[2]'
滑块=tab.ele(滑块_xpath)
平移距离=676-526 # 计算滑块平移距离
tab.actions.move_to(滑块).hold(滑块).move(offset_x=平移距离,offset_y=4,duration=2.5).release() # 执行滑动操作
input('请按回车键继续')
第十课 数据监听和抓包
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium,ChromiumOptions
from pprint import pprint
options=ChromiumOptions()
# 连接浏览器并获取浏览器对象
browser = Chromium(options)
tab=browser.latest_tab
tab.listen.start('spa1.scrape.center/api/movie') # 开始监听,指定获取包含该文本的数据包, 注意:要先开启监听再打开对应的页面
tab.get('https://spa1.scrape.center/') # 访问网址,这行产生的数据包不监听
for packet in tab.listen.steps():
pprint(packet.response.body) # 打印数据包url
input('请按回车键继续')
第11课 多线程操作标签页
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium, ChromiumOptions
from pprint import pprint
import threading
import concurrent.futures
# 设置Chromium浏览器选项,使用系统用户路径
co = ChromiumOptions().use_system_user_path()
# 连接浏览器并获取浏览器对象
browser = Chromium(co)
# 获取标签页对象并打开目标网址
tab_instance = browser.new_tab('https://xiaoaojianghu.chibaba.cn/')
# XPath定位到章节列表的无序列表
chapters_xpath = 'x:/html/body/div[2]/div[3]/div[1]/ul'
chapter_dict = {}
# 从网页中提取章节标题和链接
for chapter in tab_instance(chapters_xpath).eles('t:a@@rel=nofollow'):
chapter_dict[chapter.text] = chapter.link
# 打印提取到的章节字典
pprint(chapter_dict)
list_chapter = list(chapter_dict.keys())
def fetch_and_save_chapter(chapter_title, chapter_url):
new_tab = browser.new_tab(chapter_url) # 打开章节链接
chapter_content = new_tab('@id=TextContent').text # 获取章节内容
print(chapter_content)
print(f"正在下载笑傲江湖 {chapter_title}")
tab_instance.wait(1)
# 将章节内容写入文件
with open(f'./笑傲江湖_{chapter_title}.txt', 'w', encoding='utf-8') as file:
file.write(chapter_content)
# threading.Thread(target=new_tab.close).start() # 关闭新标签页
new_tab.close()
#- 单线程
# for aa in list_chapter:
# fetch_and_save_chapter(aa, chapter_dict[aa])
#- 多线程
def main():
# 创建一个线程池,最多允许 4 个线程同时运行
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
# 提交多个任务到线程池
futures = [executor.submit(fetch_and_save_chapter, chapter_title, chapter_url)
for chapter_title, chapter_url in chapter_dict.items()]
if __name__ == "__main__":
main()
input("按下回车键退出")
第12课 控制浏览器插件
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium,ChromiumOptions
options=ChromiumOptions().add_extension(r'C:UsersAdministratorDesktop插件Proxy SwitchyOmega 2.5.21') # 插件下载 https://www.crxsoso.com/
# 连接浏览器并获取浏览器对象
browser = Chromium(options)
# 获取标签页对象并打开网址
tab = browser.new_tab('https://www.baidu.com/')
tab.wait(3)
插件url='chrome-extension://padekgcemlokbadohgkifijomclgjgif/options.html'
tab.get(插件url)
tab.ele(' 通用').click()
tab.ele('新建情景模式…').click()
tab.ele('PAC情景模式').click()
input('请按回车键继续')
第13课 异步操作浏览器标签页
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
# datarecorder 库使用文档 https://drissionpage.cn/DataRecorderDocs/usage/introduction/
import asyncio
from DrissionPage import Chromium
from DataRecorder import Recorder
from loguru import logger
# 定义异步采集方法
async def collect(tab, recorder, title, page=1):
# 遍历所有标题元素
for i in tab.eles('.title project-namespace-path'):
# 获取某页所有库名称,记录到记录器
recorder.add_data((title, i.text, page))
logger.info((title, i.text, page))
# 获取下一页按钮
btn = tab('@rel=next', timeout=2)
# 如果有下一页,点击翻页并递归调用自身
if btn:
btn.click(by_js=True)
await asyncio.sleep(1) # 异步等待
# 增加页数并递归调用
await collect(tab, recorder, title, page + 1)
# 主函数
async def main():
# 新建浏览器对象
browser = Chromium()
# 第一个标签页访问网址
tab1=browser.new_tab('https://gitee.com/explore/ai')
# 新建一个标签页并访问另一个网址,返回其对象
tab2 = browser.new_tab('https://gitee.com/explore/machine-learning')
# 新建记录器对象
recorder = Recorder('data.csv')
# 创建异步任务
task1 = asyncio.create_task(collect(tab1, recorder, 'ai'))
task2 = asyncio.create_task(collect(tab2, recorder, '机器学习'))
# 等待任务完成
await task1
await task2
print("所有任务完成")
recorder.record()
# 运行主函数
if __name__ == '__main__':
asyncio.run(main())
第14课 批量抓取某东商品评论
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
import time
from DrissionPage import Chromium
from loguru import logger
# 设置日志记录到文件
logger.add("JD_comment.log", format="{time} {message}")
# 初始化浏览器
browser = Chromium()
# 打开京东首页
main_tab = browser.new_tab('https://www.jd.com/')
# 获取搜索框并输入关键词
search_input = main_tab.ele('tag:input@@id=key')
search_input.input('小米手机')
# 点击搜索按钮
main_tab('tag:button@@aria-label=搜索').click()
# 获取搜索结果列表
search_results = main_tab.eles('t:li@@class=gl-item')
# 打印每个搜索结果的文本
# for result in search_results:
# logger.info(result)
# 点击搜索结果中的第二个商品以打开商品详情页
product_detail_tab = search_results[1].ele('t:a').click.for_new_tab()
# 点击评论标签页
product_detail_tab.ele('@data-anchor=#comment').click()
# 获取并打印商品评论
def get_comments(tab):
for comment in tab.eles('t:div@@class=comment-item'):
# logger.info(comment)
logger.info(comment('.comment-con').text) # 记录评论内容
if recomment:=comment.ele('.recomment',timeout=2):
logger.error(recomment.text)
time.sleep(2)
# 获取第一页评论并点击下一页
get_comments(product_detail_tab)
product_detail_tab.ele('t:a@@rel=2').click()
# 循环获取剩余页码的评论
for _ in range(4):
get_comments(product_detail_tab)
product_detail_tab.ele('下一页').click()
第15课 线程池+消息队列 采集网页数据
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium, ChromiumOptions
import threading
import concurrent.futures
import time
import queue
from loguru import logger
# 创建一个队列用于存储标签页对象
标签页队列= queue.Queue()
# 启动浏览器并获取标签页对象
co = ChromiumOptions()
browser = Chromium(co)
tab_instance = browser.new_tab('https://www.bigee.cc/book/20233/')
# 获取所有章节链接
链接列表=[i.link for i in tab_instance('t:div@@class=listmain').eles('t:a') if 'book' in i.link]
# 链接列表=链接列表[:15]
print(链接列表)
def 打开网页(url):
if url is None:
return
t = browser.new_tab(url)
标签页队列.put(t)
logger.info(f'{t.title} 该网页已经打开')
time.sleep(2)
def 采集网页数据():
while True:
t = 标签页队列.get()
if t is None: # 如果获取的消息为None,则退出循环
break
logger.error(t.ele('#chaptercontent').text[:15])
threading.Thread(target=t.close).start()
logger.warning(f'{t.title} 已经完成抓取...')
print('数据采集完成')
采集线程数=6
with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor1, concurrent.futures.ThreadPoolExecutor(max_workers=采集线程数) as executor2:
# 提交任务到网页打开线程池
pool1 = [executor1.submit(打开网页, chapter_url) for chapter_url in 链接列表]
time.sleep(1)
# 提交任务到第网页数据采集线程池
pool2 = [executor2.submit(采集网页数据) for i in range(采集线程数)]
# 等待线程池1所有任务完成
concurrent.futures.wait(pool1)
# 批量添加结束标记,通知线程池2关闭
[标签页队列.put(None) for _ in range(采集线程数)]
input('按任意键退出.......')
第16课 监听控制台数据和获取异步js数据
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium,ChromiumOptions
from loguru import logger
options=ChromiumOptions()
# 连接浏览器并获取浏览器对象
browser = Chromium(options)
# 获取标签页对象并打开网址
tab = browser.new_tab('https://spa1.scrape.center/')
tab.console.start()
# 一条日志信息
# logger.info(tab.console.wait().text)
js_code='''
console.log(window.location.href);
'''
tab.run_js(js_code)
logger.info(tab.console.wait().text)
# 所有日志信息
for data in tab.console.messages:
logger.info(data.text)
fetch_code=r'''fetch("https://spa1.scrape.center/api/movie/?limit=10&offset=0", {
"referrer": "https://spa1.scrape.center/",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": null,
"method": "GET",
"mode": "cors",
"credentials": "omit"
});
'''
#立即调用的箭头函数形式
response_code='''
(async ()=>{
var res = await fetch_code
let data = await res.text();
console.log(data);
})()
'''.replace('fetch_code',fetch_code)
tab.run_js(response_code)
tab.wait(3)
logger.info(tab.console.wait().text)
input('请按回车键继续')
---·
第20课 抖音直播间弹幕抓取采集
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
# 骚神DP教学
# 电脑内需要提取安装谷歌浏览器或者其他chromium内核的浏览器 比如 edge浏览器 qq浏览器 360浏览器
# Drissionpage官网 http://drissionpage.cn/
# Drissionpage 版本需要大于等于 4.1.0.0
from DrissionPage import Chromium,ChromiumOptions
from loguru import logger
# 配置日志输出到文件
logger.add('弹幕1.txt',rotation='100 MB',encoding='utf-8')
# 连接浏览器并获取浏览器对象
browser = Chromium(5678)
url='https://live.douyin.com/200852386071'
# 获取标签页对象并打开网址
tab = browser.new_tab(url)
# 开始监听控制台输出
tab.console.start()
logger.warning(f'开始监听记录{tab.url}的弹幕')
# 等待弹幕标签加载完成
tab.wait.eles_loaded('.webcast-chatroom___list')
tab.wait(2)
observer_code=r'''
// 选择要监控的目标节点
const targetNode = document.querySelector('.webcast-chatroom___list');
// 创建一个配置对象,指定要观察的变化类型
const config = { childList: true, subtree: true };
// 创建一个回调函数,当目标节点发生变化时执行
const callback = (mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
// 检查新增的节点是否是 div 元素
if (node.nodeType === Node.ELEMENT_NODE && node.tagName === 'DIV') {
const currentTime = new Date().toLocaleTimeString(); // 获取当前时间
console.log(currentTime,node.innerText); // 打印当前时间和新增 div 的 innerText
}
});
}
}
};
// 创建一个 MutationObserver 实例
const observer = new MutationObserver(callback);
// 开始观察目标节点
observer.observe(targetNode, config);
'''
tab.run_js(observer_code)
while True:
# 打印控制台的输出
logger.info(tab.console.wait().text)
input('请按回车键继续')
第23课 逆向js之自动化Hook
#!/usr/bin/env python
# -*- coding:utf-8 -*-#
from DrissionPage import Chromium
browser = Chromium(8976)
#自动点击确认按钮
tab=browser.new_tab()
tab.get('https://zh.javascript.info/alert-prompt-confirm')
tab.wait(5)
# 禁用alert和confirm的弹窗
js_code='''
window.alert = ()=> {console.log("alert 被禁用");}
window.confirm = ()=> {console.log("confirm 被禁用");}
'''
tab.run_js(js_code)
tab.wait(2)
print('开始点击弹窗;')
tab.eles('t:a@@title=运行')[-2].click()
tab.wait(3)
print('已经点击..')
input('输入任意键退出..')
第24课 插件扫描代码
class ExtensionScaner:
def __init__(self, browser):
self.browser = browser
self.tab=None
def get_extensions_info(self):
"""获取浏览器扩展信息列表"""
tab = self.browser.new_tab("chrome://extensions/",background=True)
tab.wait(1)
extensions = []
self.tab=tab
extension_items= tab("t:extensions-manager").sr("#viewManager")
extension_items=extension_items.ele("#items-list").sr(".items-container").eles("t:extensions-item")
# 遍历提取扩展信息
for item in extension_items:
name = item.sr("#name").text
ext_id = item.attr("id")
description = item.sr("#description").text
extensions.append({
"name": name,
"id": ext_id,
"description": description
})
return extensions
def get_id_by_name(self, extension_name):
"""根据扩展名称获取扩展ID"""
extensions = self.get_extensions_info()
for extension in extensions:
if extension_name in extension["name"] :
return extension["id"]
return None
def close(self):
self.tab.close()
第25课 Ubuntu 使用python虚拟环境
sudo apt install python3.12-venv
python3 -m venv path/to/venv
source path/to/venv/bin/activate
第26课 13322 ws逆向
import websocket
import time
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64
ws_url = "wss://score-p.599.com/scorepush/football"
key = b"777db0c19edfaace"
iv = b"9876543210599311"
def aes_cbc_decrypt(encrypted_data, key, iv):
ciphertext = base64.b64decode(encrypted_data)
cipher = AES.new(key, AES.MODE_CBC, iv=iv)
decrypted_data = cipher.decrypt(ciphertext)
plaintext = unpad(decrypted_data, AES.block_size)
return plaintext
def sync_websocket_client():
url = "wss://score-p.599.com/scorepush/football"
ws = websocket.create_connection(url)
print(f"Connected to: {url}")
try:
send_data = '{"device":"pc","topic":"USER.topic.app.8"}'
ws.send(send_data)
while True:
time.sleep(1)
try:
message = ws.recv()
message = aes_cbc_decrypt(message, key, iv)
print(f"Received: {message}")
except websocket.WebSocketException as e:
print(f"Error: {e}")
break
except Exception as e:
print(f"Connection error: {e}")
finally:
ws.close()
if __name__ == "__main__":
sync_websocket_client()
第27课 监听爬取小红书评论
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
小红书评论数据下载脚本
功能:访问指定小红书页面,监听并下载评论数据
"""
import json
import time
from DrissionPage import Chromium, ChromiumOptions
from loguru import logger
# 配置日志
logger.add("xiaohongshu_comment.log", format="{time} {level} {message}")
def download_xiaohongshu_comments(url: str, output_file: str):
"""
下载小红书评论数据
:param url: 小红书页面URL
:param output_file: 输出文件路径
"""
try:
# 配置浏览器选项
co = ChromiumOptions()
co.headless(False) # 显示浏览器窗口
co.set_local_port('9222') # 设置调试端口
# 创建浏览器对象
browser = Chromium(co)
tab = browser.latest_tab
# 监听网络请求
logger.info("开始监听评论数据...")
tab.listen.start('comment') # 监听包含comment的请求
logger.info(f"正在访问页面: {url}")
tab.get(url)
tab.eles(".title")[4].click() # 点击视频
# 等待足够时间获取数据
time.sleep(4)
# 获取监听到的数据
data = tab.listen.wait()
if not data:
logger.error("未获取到评论数据")
return
# data=data.response.body
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(data.response.body, f, ensure_ascii=False, indent=4)
logger.success(f"评论数据已保存到: {output_file}")
except Exception as e:
logger.error(f"发生错误: {str(e)}")
finally:
# 关闭浏览器
if 'browser' in locals():
browser.quit()
if __name__ == '__main__':
# 配置参数
target_url = 'https://www.xiaohongshu.com/explore/'
output_path = "comments_data.json"
# 执行下载
download_xiaohongshu_comments(target_url, output_path)