我是@马哥python说,一名10年程序猿。我是软件原创开发者。
采集软件的主要目标是实现笔记数据的自动化采集,包括笔记正文、发布时间、以及转评赞藏等关键信息。通过设计直观的界面,旨在让即使是技术小白也能轻松使用这款工具。
软件界面截图:(软件更新迭代了好几轮,以下是最新v2.1版本截图)
爬取结果截图:(部分爬取到的数据已自动保存到Excel文件)
以上。
演示视频:
软件运行演示过程:https://cloud.tencent.com/developer/video/79961
软件说明:
几点重要说明:
附属说明:v2.2版本已加入评论者uid号!!
爬虫采集模块:
首先,定义接口地址作为请求地址:
代码语言:python
代码运行次数:0
复制
# 请求地址 url = 'https://www.douyin.com/aweme/v1/web/comment/list/'
定义一个请求头,用于伪造浏览器:
代码语言:python
代码运行次数:0
复制
# 请求头 h1 = { 'accept': 'application/json, text/plain, */*', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 'cookie': '换成自己的cookie值', 'referer': 'https://www.douyin.com/', 'sec-ch-ua': '"Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': ua, }
其中,cookie是个关键参数,需要填写到软件界面里。cookie获取方法如下:
加上请求参数,告诉程序你的爬取条件是什么:
代码语言:python
代码运行次数:0
复制
# 请求参数 params = { 'device_platform': 'webapp', 'aid': 6383, 'channel': 'channel_pc_web', 'aweme_id': video_id, # 视频id 'cursor': page * 20, 'count': 20, 'item_type': 0, 'insert_ids': '', 'rcFT': '', 'pc_client_type': 1, 'version_code': '170400', 'version_name': '17.4.0', 'cookie_enabled': 'true', 'screen_width': 1440, 'screen_height': 900, 'browser_language': 'zh-CN', 'browser_platform': 'MacIntel', 'browser_name': 'Chrome', 'browser_version': '109.0.0.0', 'browser_online': 'true', 'engine_name': 'Blink', 'engine_version': '109.0.0.0', 'os_name': 'Mac OS', 'os_version': '10.15.7', 'cpu_core_num': 4, 'device_memory': 8, 'platform': 'PC', 'downlink': 1.5, 'effective_type': '4g', 'round_trip_time': 150, 'webid': 7184233910711879229, 'msToken': 'LZ3nJ12qCwmFPM1NgmgYAz73RHVG_5ytxc_EMHr_3Mnc9CxfayXlm2kbvRaaisoAdLjRVPdLx5UDrc0snb5UDyQVRdGpd3qHgk64gLh6Tb6lR16WG7VHZQ==', }
下面就是发送请求和接收数据:
代码语言:python
代码运行次数:0
复制
# 请求地址 url = 'https://www.douyin.com/aweme/v1/web/comment/list/' # 发送请求 r = requests.get(url, headers=h1, params=params) # 转json格式 json_data = r.json()
定义一些空列表,用于存放解析后字段数据:
代码语言:python
代码运行次数:0
复制
ip_list = [] # ip属地 text_list = [] # 评论内容 create_time_list = [] # 评论时间 user_name_list = [] # 评论者昵称 user_url_list = [] # 评论者主页链接 user_unique_id_list = [] # 评论者抖音号 like_count_list = [] # 点赞数 cmt_level_list = [] # 评论级别
循环解析字段数据,以"评论内容"为例:
代码语言:python
代码运行次数:0
复制
# 循环解析 for comment in comment_list: # 评论内容 text = comment['text'] text_list.append(text)
其他字段同理,不再赘述。
最后,是把数据保存到csv文件:
代码语言:python
代码运行次数:0
复制
# 保存数据到DF df = pd.Dataframe( { '目标链接': 'https://www.douyin.com/video/' + str(video_id), '页码': page, '评论者昵称': user_name_list, '评论者id': user_unique_id_list, '评论者主页链接': user_url_list, '评论时间': create_time_list, '评论IP属地': ip_list, '评论点赞数': like_count_list, '评论级别': cmt_level_list, '评论内容': text_list, } )
完整代码中,还含有:判断循环结束条件、时间戳转换、二级评论及二级展开评论的采集等关键实现逻辑,详见文末。
软件界面模块:
软件界面采用tkinter开发。
主窗口部分:
代码语言:python
代码运行次数:0
复制
# 创建日志目录 work_path = os.getcwd() if not os.path.exists(work_path + "/logs"): os.makedirs(work_path + "/logs") # 创建主窗口 root = tk.Tk() root.title('抖音评论采集软件 | 马哥python说') # 设置窗口大小 root.minsize(width=850, height=650)
填写cookie控件:
代码语言:python
代码运行次数:0
复制
# 【填入cookie】 tk.Label(root, justify='left', font=('微软', 14), text='个人cookie:').place(x=30, y=75) entry_ck = tk.Text(root, bg='#ffffff', width=110, height=2, ) entry_ck.place(x=30, y=100, anchor='nw') # 摆放位置
填写视频链接控件:
代码语言:python
代码运行次数:0
复制
# 【视频链接】 tk.Label(root, justify='left', font=('微软', 14), text='视频链接:').place(x=30, y=145) note_ids = tk.StringVar() note_ids.set('') entry_nt = tk.Text(root, bg='#ffffff', width=110, height=14, ) entry_nt.place(x=30, y=170, anchor='nw') # 摆放位置
底部软件版权说明:
代码语言:python
代码运行次数:0
复制
# 版权信息 copyright = tk.Label(root, text='@马哥python说 All rights reserved.', font=('仿宋', 10), fg='grey') copyright.place(x=290, y=625)
以上。
日志模块:
日志文件是记录系统或应用程序运行时发生的事件和活动的文件。这些事件和活动可以是系统错误、警告、信息和调试信息等。同时也方便软件用户追溯运行历史记录。
日志代码:
代码语言:python
代码运行次数:0
复制
def get_logger(self): self.logger = logging.getLogger(__name__) # 日志格式 formatter = '[%(asctime)s-%(filename)s][%(funcName)s-%(lineno)d]--%(message)s' # 日志级别 self.logger.setLevel(logging.DEBUG) # 控制台日志 sh = logging.StreamHandler() log_formatter = logging.Formatter(formatter, datefmt='%Y-%m-%d %H:%M:%S') # info日志文件名 info_file_name = time.strftime("%Y-%m-%d") + '.log' case_dir = r'https://www.360doc.cn/mip/logs/' info_handler = TimedRotatingFileHandler(filename=case_dir + info_file_name, when='MIDNIGHT', interval=1, backupCount=7, encoding='utf-8')
日志文件截图: