代码有点长,完整代码放在文章最后了。

最后的数据存储为了3个表,表的各字段如下:

# csv头部
writer.writerow(('话题链接', '话题内容', '楼主ID', '楼主昵称', '楼主性别', '发布日期','发布时间', '转发量', '评论量', '点赞量', '评论者ID', '评论者昵称','评论者性别', '评论日期', '评论时间', '评论内容'))  #微博博文与评论的全部信息writer_1.writerow(('话题链接',  '楼主ID', '话题内容','楼主昵称', '楼主性别','是否认证','认证类型','是否认证金v','发博数量','关注人数','粉丝数','微博等级', '发布日期','发布时间', '转发量', '评论量', '点赞量'))        #微博博文的信息(不包含评论)writer_2.writerow(('楼主ID','评论者ID','话题内容','评论内容','评论者昵称', '评论者性别','是否认证','认证类型','是否认证金v','发博数量','关注人数','粉丝数','微博等级', '发布日期','评论日期','评论时间', '回复量', '点赞量'))                   #评论的信息

1.爬取前的准备工作:

建议使用谷歌浏览器,通过cookie和headers来登录微博,注意cookie是手机登录模式下的cookie,否则评论会获取不全

headers = {'cookie': cookie,'user-agent': ua,'Referer':'https://s.weibo.com/weibo?q=%E5%9B%BD%E8%B6%B3%E6%AD%A6%E7%A3%8A&typeall=1&suball=1&timescope=custom:2021-11-05:2021-12-06-0&Refer=g','x-requested-with': 'XMLHttpRequest'
}

2.通过微博网页版的高级搜索,复制对应的URL

3.通过requests.get(url=url, headers=headers) 来解析网页,并通过正则表达式获取到所有微博的唯一标识符mid,后续都根据mid来获取微博信息

        rep1 = requests.get(url=api_url, headers=headers)# rep1.enconding= rep1.apparent_encodingtry:rep=rep1.text comment_ID=re.findall('(?<=mid=")\d{16}', rep)comments_ID.extend(comment_ID)print(page,"页id获取成功!",comment_ID)except:print(page,"页id获取有误!")

4.通过手机端口来爬取数据,会比电脑端口爬取数据方便。在手机端口里(m.weibo.cn),根据刚刚获取到的mid可以获得每条微博的数据。

article_url = 'https://m.weibo.cn/detail/' + comment_ID
html_text = requests.get(url=article_url, headers=headers).text
发布日期、话题内容、楼主ID、楼主昵称等信息都可以通过正则表达式从html_text中获取到。
# 话题内容
find_title = re.findall('.*?"text": "(.*?)",.*?', html_text)[0]
title_text = re.sub('<(S*?)[^>]*>.*?|<.*? />', '', find_title)  #
# print("title_text = ", title_text)# 楼主ID
title_user_id = re.findall('.*?"id": (.*?),.*?', html_text)[1]
# print("title_user_id = ", title_user_id)# 楼主昵称
title_user_NicName = re.findall('.*?"screen_name": "(.*?)",.*?', html_text)[0]
# print("title_user_NicName = ", title_user_NicName)# 楼主性别
title_user_gender = re.findall('.*?"gender": "(.*?)",.*?', html_text)[0]

5.通过一条博文的max_id和max_id_type获取到博文下面的评论信息

def parse_page(jsondata):if jsondata:items = jsondata.get('data')item_max_id = {}item_max_id['max_id'] = items['max_id']item_max_id['max_id_type'] = items['max_id_type']print('评论页面max_id和max_id_type获取成功!')return item_max_iddef get_page(comment_ID, max_id, id_type):params = {'max_id': max_id,'max_id_type': id_type}url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id={}&max_id_type={}'.format(comment_ID, comment_ID,max_id,id_type)try:time.sleep(2)r = requests.get(url,headers=headers)if r.status_code==200:print('评论页面解析成功!')return r.json() except requests.ConnectionError as e:print('评论页面解析错误!', e.args)pass

6.根据正则表达式获取评论数据

            # 评论者IDuser_id = json['user']['id']# 评论者昵称user_name = json['user']['screen_name']# 评论者性别,m表示男性,表示女性user_gender = json['user']['gender']user_statuses_count = json['user']['statuses_count']#评论者发博数量user_verified = json['user']['verified']  # 评论者是否认证user_verified_type = json['user']['verified_type']  # 评论者认证类型if user_verified=='true':user_verified_type_ext = json['user']['verified_type_ext']  # 评论者是否金velse:user_verified_type_ext = 0user_follow_count = json['user']['follow_count']  # 评论者关注数user_followers_count = json['user']['followers_count']  # 评论者发博数user_urank = json['user']['urank']  # 评论者微博等级# 获取评论comments_text = json['text']comment_text = re.sub('<(S*?)[^>]*>.*?|<.*? />', '', comments_text)  # 正则匹配掉html标签# print('评论内容:',comment_text)# 评论时间created_times = json['created_at'].split(' ')comment_total_number=json["total_number"]#评论的回复数量comment_like_count = json["like_count"]  # 评论的点赞数量

其实整个爬取的流程就是获取url,解析网页,根据正则表达式获取需要的信息。

代码有点长,完整代码放在文章最后了。

链接: https://pan.baidu.com/s/1LPCYq3dwBBzPty0FLBp4pA 提取码: 79yu 复制这段内容后打开百度网盘手机App,操作更方便哦

如果有需要的话,原代码需要改动的地方如下:

1.文件存储路径:

2. cookie,有时候爬虫太多次了cookie就会失效,这时候可以再换一个cookie

3.还有一个很重要的参数Refer,这里每换一个关键词最好都要改一下

4.搜索的关键词和时间范围:在原代码里year都是2021,如果想找不同年份的,可以设置year1,year2,后面api_url中记得也要改成year1,year2

5.每次爬取的页。在高级搜索中最多只能看50页的内容,50页之外的就是实时微博了,而不是想要搜索的微博。所以如果想搜索的微博远不止50页,那就只能再缩短时间范围。比如你想找1.1-1.15期间含有关键词“张明杰”的微博,第50页的最后一条微博是1.5日18:00,那只能再把时间范围改为1.5 18:00-1.15日,然后再去爬取数据。

start_date和end_date是为了防止有时间范围之外的微博被爬取到了,这个可以根据需要改成自己的

抓取某话题下指定时间内的微博数据,包括博文数据、评论信息等(可通过高级搜索筛选时间)相关推荐

  1. Python抓取网页云音乐指定歌手的歌曲和评论数量

    之前简单学了一下Python,没做过东西,心血来潮来了个idea,就写了一个抓取网页云音乐指定歌手的歌曲和评论数量的脚本. 代码如下,如果缺少包则用pip安装一下,不过AES加密用到的pycrypto ...

  2. 「docker实战篇」python的docker-打造多任务端app应用数据抓取系统(下)(35)

    上次已经把python文件挂载到虚拟机上了,这次主要设置下虚拟机通过docker容器的方式. 运行 python 代码运行 >启动一个crt的会话 docker run -it -v /root ...

  3. python爬取网页上的特定链接_python3下scrapy爬虫(第三卷:初步抓取网页内容之抓取网页里的指定数据)...

    上一卷中我们抓取了网页的所有内容,现在我们抓取下网页的图片名称以及连接 现在我再新建个爬虫文件,名称设置为crawler2 做爬虫的朋友应该知道,网页里的数据都是用文本或者块级标签包裹着的,scrap ...

  4. Linux怎样给线程取名字,Linux下指定线程的名字

    为了能方便的区分一个进程中的每个线程,可以通过prctl()给每个线程取个名字.这样在会创建多个线程的程序执行过程中,就能知道一个pid或tid对应的是哪个线程,对调试程序有一定帮助. prctl是个 ...

  5. 使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的web应用...

    在线演示  本地下载 如果你曾经开发过内容聚合类网站的话,使用程序动态整合来自不同页面或者网站内容的功能肯定对于你来说非常熟悉.通常使用java的话,我们都会使用到一些HTML的解析,例如,httpp ...

  6. 基于selenium和xpath定位方法爬取某个话题下的微博内容!是真的强!

    为什么这期要叫暴力爬虫呢?因为笔者认为基于selenium方法非常的简单粗暴!!理由有两点: 1.在selenium方法下,我们可以通过调用浏览器驱动来实现模拟鼠标点击.滑轮下滑以及输入文本等操作,就 ...

  7. 爬虫系列(2):暴力爬虫——基于selenium和xpath定位方法爬取某个话题下的微博内容

    为什么这期要叫暴力爬虫呢?因为笔者认为基于selenium方法非常的简单粗暴!!理由有两点: 1.在selenium方法下,我们可以通过调用浏览器驱动来实现模拟鼠标点击.滑轮下滑以及输入文本等操作,就 ...

  8. 抓取特定路径下文件 可批量压缩成压缩包 并分享到微信

    创建文件类 public class GrabDataActivity extends FragmentActivity {private Context context; private TextV ...

  9. ffmpeg抓取rtsp流并保存_详细解析RTSP框架和数据包分析(1)

    0.引言 本文主要讲解RTSP框架和抓取RTSP数据包,进行详细分析.可以阅读以下几篇文章,能够帮助你更详细理解. 手把手搭建RTSP流媒体服务器 HLS实战之Wireshark抓包分析 HTTP实战 ...

最新文章

  1. MD5加密 登录用户名密码
  2. android listview分页显示,Android应用中使用ListView来分页显示刷新的内容
  3. C语言程序设计 | 指针的进阶(一):字符指针、数组指针、指针数组、函数指针
  4. python扫盲系列-(2)
  5. Java冒泡实现类Collections.sort()
  6. asp.net中让GridView加上垂直流动条并让标头不动
  7. BestCoder4 1002 Miaomiao's Geometry (hdu 4932) 解题报告
  8. html在线发布ipa文件在哪里,打包ipa文件
  9. PHP MySQL 数据字典生成器
  10. 计算机网络经典试题答案,2016年计算机软考网络工程师经典练习试题及答案
  11. Java项目:企业固定资产管理系统(java+SpringBoot+VUE+maven+mysql)
  12. 如何把qsv视频格式转换成mp4视频格式
  13. 如何将本地应用制作成docker镜像
  14. Git add回退 commit回退
  15. IDaaS储备知识5 - 扫码登录
  16. RHEL 7安装的步骤
  17. 央视《家有妙招》整理版,共125招,值得永远收藏
  18. Cesium淹没分析(干货)
  19. Linuxwindows时间服务器搭建定时同步设置详细讲解
  20. asp:ScriptManager

热门文章

  1. 栈内存和堆内存Java(详细实例讲解)
  2. idea正则全局替换代码
  3. [重磅消息]AutoMagic自动化测试平台开源
  4. 编译器与编辑器以及IDE的区别【前方高能】
  5. 用python函数画德国国旗代码_用Python的turtle模块画国旗
  6. Windows VS Linux 那个好?
  7. 水晶头镀金30U和50区别
  8. 项目开发过程中的开发环境、测试环境、生产环境、UAT环境、仿真环境
  9. 解读智能机器人的各项发展潜力
  10. matlab 滤滤程序,在matlab中如何调用matlab中值滤波函?