【selenium方式】获取微博指定用户指定日期内所有帖子详细数据

这篇文章主要放源代码,思路不会介绍特别清楚,详细思路可以看评论区的b站讲解视频。

1.场景需求

获取微博肖战超话内容部分用户的帖子数据,日期范围限定在近2个月,要求获得帖子的发布时间、帖子文本内容、转发数据、评论数据和点赞数据(不包括评论的内容和点赞的人)。

2.网站调研

通过调查发现,微博有2个入口,第一种如下:

第二种如下:

 这2种入口爬取方式不同,我因为不熟悉微博,所以也是把两个入口的方式都试了一遍。。。所以这里有个经验要分享一下:爬虫的最终目的是获取需要的数据,不管用什么方式,从网站哪个入口开始,都应该要实现高效率的获得所有数据。因此在爬虫之前,应该花时间了解目标网站的数据存储方式,切忌一上来就找个网址开始胡乱一通爬,得动脑子思考、观察再决定爬取方案。尤其是规模大的项目,方案没选好后面会出现爬取速度很慢、内存不够用、爬一半发现方案行不通等问题。

3.解决方案

这里写文章主要就放源代码,思路不会介绍的特别清楚,详细思路可以看评论区的b站讲解视频。

3.1 入口选择

通过不断尝试,最后发现一个兼具通用性和速度的方法。首先选择如下入口,通过微博自带的微博lite,点击在浏览器打开:

 这个入口的优点是不需要登录就可以获取全部上述信息,因此也就省去了模拟登录的麻烦。接下来搜索对应用户的ID,便可以进入其主页:

3.2 实现方法

可以发现每个用户所有发布的帖子都在上面的个人主页中,因此需要不断向下滑动以获取更多的数据。这种特点比较适合用selenium,通过模拟浏览器的滑动操作加时间判断便可以较为精准的得到指定时间内的帖子。那么下面就是源代码,一个函数,很简洁:

def getTieziContent(user_url, file_path, start_num=0, browser='chrome', step=1, roll_height=2500):"""输入用户主页url,直接获取帖子的文本和相关数据注意:这个方法不点开帖子,速度更快:param start_num: 崩溃后从哪个帖子数开始爬:param user_url: 用户主页url:param browser: 用什么浏览器爬:param step: 爬取帖子数的步长,0为全部爬取:param roll_height: 滚动多少页面:param file_path: 存储用户所有帖子的url文件路径(人名即可):return: 写入文件"""# 先用浏览器打开用户主页if browser == 'chrome':path = "C:\Program Files\Google\Chrome\Application\chromedriver.exe"ops = chrom_opt()service_path = Service(executable_path=path)# ops.add_argument("--headless")ops.add_argument('--blink-settings=imagesEnabled=false')ops.add_argument('--disable-plugins')ops.add_argument("--disable--gpu")ops.add_argument("--disable-images")ops.add_argument('--disk-cache-size=2000000000')  # 设置大容量内存driver = webdriver.Chrome(ops, service_path)driver.set_window_size(480, 1080)  # 设置窗口大小driver.set_window_position(800, 0)  # 设置窗口x, y位置driver.get(user_url)time.sleep(1)  # 1秒等待加载else:path = "C:\Program Files\Mozilla Firefox\geckodriver.exe"  # 浏览器驱动器service_path = Service(executable_path=path)binary_path = (r'C:\Program Files\Mozilla Firefox\firefox.exe')  # binary_path就是你的浏览器路径ops = Options()ops.binary_location = binary_path# ops.add_argument("--headless")ops.add_argument('--blink-settings=imagesEnabled=false')ops.add_argument('--disable-plugins')ops.add_argument("--disable--gpu")ops.add_argument("--disable-images")ops.add_argument('--disk-cache-size=2000000000')  # 设置大容量内存driver = webdriver.Firefox(ops, service_path)driver.set_window_size(480, 1080)  # 设置窗口大小driver.set_window_position(900, 0)  # 设置窗口x, y位置driver.get(user_url)time.sleep(1)  # 1秒等待加载# 先获取关注数和粉丝数name = driver.find_element(By.XPATH, '/html/body/div/div[1]/div[1]/div[1]/div/div[4]/div[1]').textguanzhu_fans = driver.find_element(By.XPATH, '/html/body/div/div[1]/div[1]/div[1]/div/div[4]/div[2]').find_elements(By.CLASS_NAME, 'txt-shadow')guanzhu, fans = [i.text for i in guanzhu_fans]print(name, guanzhu, fans)# 下滑2000,帖子数正常人就可以到达2023年的帖子start_time = time.time()  # 开始时间for i in range(1, roll_height):driver.execute_script(f'document.documentElement.scrollTop={i * 100}')time.sleep(2)  # 停两秒看看翻到多少driver.execute_script("var q=document.documentElement.scrollTop=0")divs = driver.find_elements(By.CLASS_NAME, 'card-main')  # 所有帖子所在h4s = driver.find_elements(By.TAG_NAME, 'h4')  # 判断发帖时间,可以翻到2023的说明帖子数量不是很多length = len(divs)print(length)# 最后打开文件,写入用户主页出现的所有帖子的urlfor h4 in h4s[-7:]:post_time = h4.get_attribute("class")flag1 = h4.text.startswith("2023-11")flag2 = h4.text.startswith("2023-10")flag3 = h4.text.startswith("2023-9")flag4 = h4.text.startswith("2023-8")flag5 = h4.text.startswith("2023-7")flag6 = h4.text.startswith("2023-6")flag7 = h4.text.startswith("2023-5")flag8 = h4.text.startswith("2023-12")flag9 = h4.text.startswith("2023-4")flag10 = h4.text.startswith("2023-3")flag11 = h4.text.startswith("2023-1")flag12 = h4.text.startswith("2022")flag13 = h4.text.startswith("2021")flag14 = h4.text.startswith("2020")flag15 = h4.text.startswith("2019")flag16 = h4.text.startswith("2018")flag17 = h4.text.startswith("2017")flag18 = h4.text.startswith("2016")flag19 = h4.text.startswith("2015")flag20 = h4.text.startswith("2014")flag21 = h4.text.startswith("2013")if post_time == 'm-text-cut' and (flag1 or flag2 or flag3 or flag4 or flag5 or flag6 or flag7 orflag8 or flag9 or flag10 or flag11 or flag12 or flag13 or flag14 orflag15 or flag16 or flag17 or flag18 or flag19 or flag20 or flag21):with open(f"肖战3类粉丝数据/10个来自评论区/{file_path}-用户信息.csv", 'a', encoding='utf_8_sig',newline="") as f:writer = csv.writer(f)writer.writerow([name, guanzhu, fans])with open(f"肖战3类粉丝数据/10个来自评论区/{file_path}-用户信息.csv", 'a', encoding="utf_8_sig",newline="") as f:writer = csv.writer(f)for i in range(start_num, length, step):if i % 100 == 0:print(f"爬完{i}个")# if i == 1500:#     breaktry:tiezis = driver.find_elements(By.CLASS_NAME, 'card-main')  # 重新定位,因为dom树刷新了name = tiezis[i].find_element(By.TAG_NAME, 'h3').text  # 发布人idpost_time = tiezis[i].find_element(By.TAG_NAME, 'header').find_element(By.CLASS_NAME, 'time').text  # 发布时间text = tiezis[i].find_element(By.CLASS_NAME, 'weibo-og').text  # 发布内容repost = tiezis[i].find_element(By.TAG_NAME, 'footer').find_elements(By.TAG_NAME, 'h4')[0].text  # 转发数comment = tiezis[i].find_element(By.TAG_NAME, 'footer').find_elements(By.TAG_NAME, 'h4')[1].text  # 评论数attitude = tiezis[i].find_element(By.TAG_NAME, 'footer').find_elements(By.TAG_NAME, 'h4')[2].text  # 评论数writer.writerow([name, post_time, text, repost, comment, attitude])except Exception as e:continuedriver.close()breakelse:continueif __name__ == '__main__':# 清空一下进程os.system('taskkill /F /iM chromedriver.exe')os.system('taskkill /F /iM firefox.exe')s = time.time()with open("肖战3类粉丝数据/补充.csv", 'r', encoding='utf8') as f:data = list(csv.reader(f))for i in range(47, len(data)):print(f"=====================第{i + 1}个用户======================")url = data[i][1]name = data[i][0]getTieziContent(url, name, roll_height=8000)e = time.time()print(f"{((e - s) // 60) // 60}h{((e - s) // 60) % 60}min")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/249750.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Go 快速入门】包及依赖管理 | Go 第三方包发布 | 接口 | 反射

文章目录 包和依赖管理依赖管理go modgo get go.mod 文件go.sum 文件Go Modules 发布包 接口空接口接口值类型断言 反射reflect.TypeOfreflect.ValueOf结构体反射 项目代码地址:04-PackageInterfaceReflection 包和依赖管理 Go 使用包来支持代码模块化和代码复用&…

市场复盘总结 20240201

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 昨日主题投资 连板进级率 6/27 22.2% 二进…

AI 原生时代的云计算

本文整理自2023年 12 月 20 日举办的「2023 百度云智大会智算大会」主论坛,百度副总裁谢广军的主题演讲《AI 原生时代的云计算》。 (视频回放链接:https://cloud.baidu.com/summit/aicomputing_2023/index.html) 大模型的到来&…

一些大语言模型(LLM)相关的开源项目

一些大语言模型(LLM)相关的开源项目 更多文章访问: https://www.cyisme.top 因为站内限制问题,有些图片无法显示,导致阅读体验较差,可以访问原文:《一些大语言模型(LLM)相关的开源项…

揭秘远程控制APP的便捷之美!

在这个科技日新月异的时代,我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机,你是否也有遇到过需要远程操作自己某一台手机的场景呢?今天,我要向大家推荐一款神奇的手机远程操作神器,让你可以随时随地…

(2)(2.11) RFD900

文章目录 前言 1 概述 2 主要功能 3 状态LED指示灯 4 接口 5 使用Mission Planner进行配置 6 支持不同国家/地区 7 讨论论坛 前言 RFD900 无线电调制解调器是一款高功率 900Mhz ISM 波段无线电调制解调器,设计用于远距离串行通信。据报道,其通信…

数字孪生 三维建模方式以及细节步骤流程

对于数字孪生这个概念,三维建模不同行业认知都不尽相同。有的行业认为数字孪生重点在于建模,有的行业认为在于物联感知,还有部分认为是虚拟仿真。今天重点从建模角度和大家谈谈数字孪生技术常用的三维建模方式以及精细度分级。 数字孪生平台…

基于鲸鱼优化的knn分类特征选择算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 鲸鱼优化算法(WOA) 4.1.1 包围猎物 4.1.2 螺旋式搜索 4.1.3 更新策略 4.2 K近邻(KNN)分类器 4.3 基于WOA的KNN分类特征选择算法 5.完…

ApacheNginx配置ssl证书

一、Apache配置ssl Linux版本:CentOS Linux release 7.9.2009 (Core) Apache版本:Apache/2.4.6 (CentOS) 1、安装Apache(使用默认yum源) [root10-35-1-25 ~]# yum -y install httpd2、查Apache版本&启动Apache [root10-35-…

花瓣网美女图片爬取

爬虫基础案例01 花瓣网美女图片 网站url:https://huaban.com 图片爬取 import requests import json import os res requests.get(url "https://api.huaban.com/search/file?text%E7%BE%8E%E5%A5%B3&sortall&limit40&page1&positionsear…

spdk技术原理简介和实践经验

一、导读 与机械硬盘相比,NVMe-ssd在性能、功耗和密度上都有巨大的优势,并且随着固态存储介质的高速发展,其价格也在大幅下降,这些优势使得NVMe-ssd在分布式存储中使用越来越广泛。由于NVMe-ssd的性能比传统磁盘介质高出很多&…

记一次某竞赛中的渗透测试(Windows Server 2003靶机漏洞)

靶机简介 Windows Server 2003是微软公司于2003年3月28日发布的服务器操作系统,它基于Windows XP/Windows NT 5.1进行开发,并在同年4月底上市。以下是关于Windows Server 2003的详细介绍: 系统名称与发布历程: 该产品最初被命名为…

设计模式——2_0 职责链(Chain of Responsibility)

楼下一个男人并得要死,那家隔壁的一家唱着留声机,对面是弄孩子。楼上有两人狂笑;还有打牌声,河中的船上有女人哭她死去的母亲。人类的悲欢并不相通,我只觉得他们吵闹 ——鲁迅 文章目录 定义图纸一个例子:如…

LEETCODE 170. 交易逆序对的总数

class Solution { public:int reversePairs(vector<int>& record) {if(record.size()<1)return 0;//归并 递归int left,right;left0;rightrecord.size()-1;int nummergeSort(left,right,record);return num;}int mergeSort(int left,int right, vector<int>…

C++:异常体系

异常体系 异常1.C语言传统的处理错误的方式2.C异常概念3.异常的使用3.1异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.C标准库的异常体系5.异常的优缺点 异常 1.C语言传统的处理错误的方式 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以…

Android super.img解包和打包指南(含工具下载lpunpack、lpmake、lpdump)

本文所有命令均需要在linux 上执行 一、解包 1、将Android sparse image格式的super.img转成二进制文件 $ sudo apt install android-sdk-libsparse-utils $ simg2img super.img super.img.bin 2、下载工具lpunpack 和lpmake、lpdump 以及其依赖库 下载地址:https://downl…

python执行linux系统命令的三种方式

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 1. 使用os.system 无法获取命令执行后的返回信息 import osos.system(ls)2. 使用os.popen 能够获取命令执行后的返回信息 impor…

c++学习第十四讲---STL常用容器---vector容器

vector容器&#xff1a; 1.vector基本概念&#xff1a; vector功能与数组类似&#xff0c;与数组不同的是&#xff0c;vector可以动态扩展。 2.vector构造函数&#xff1a; vector<T> v; //默认构造函数&#xff0c;创建数据类型T的容器 ve…

2022 年全国职业院校技能大赛高职组云计算赛项试卷部分解析

2022 年全国职业院校技能大赛高职组云计算赛项试卷部分解析 【赛程名称】高职组-云计算赛项第一场-私有云【任务 1】私有云服务搭建[10 分]【题目 2】Yum 源配置[0.5 分]【题目 3】配置无秘钥 ssh[0.5 分]【题目 4】基础安装[0.5 分]【题目 5】数据库安装与调优[0.5 分]【题目 …

Cloudreve个人网盘系统源码 支持云存储(七牛、阿里云OSS、腾讯云COS、又拍云、OneDrive) 基于Go框架

现在的网盘动不动就限速&#xff0c;涨价&#xff0c;弄得很是心烦。今天分享一款开源免费的网盘项目&#xff0c;基于 Go 语言开发的 Cloudreve。Cloudreve基于Go框架云存储个人网盘系统源码支持多家云存储驱动&#xff08;从机、七牛、阿里云 OSS、腾讯云 COS、又拍云、OneDr…