商务服务
【微博爬虫教程&实例】基于requests、mysql爬取大数据量博主关键字下博文及评论
2024-11-01 01:08

【关键词:手把手教程、反爬、数据库、python爬虫、微博关键词爬虫、较大数据量、数据简单过滤】

【微博爬虫教程&实例】基于requests、mysql爬取大数据量博主关键字下博文及评论

本教程适合微博相关爬虫需求者阅读,完整实例源码将放置在文末github链接中。

该实例针对微博的反爬措施进行优化,可实现较大数据量的数据爬取需求(十万量级)。

                   主要使用到的库有

                        requests:requests库是Python中用来模拟浏览器发送网络请求与得到响应数据包的库,可以说是实现爬虫原理的核心

                        json:用于解析(如格式化为方便python处理的字典格式)得到的响应数据包,以便于后续对得到的数据进行操作处理

                        pymysql:是python下用于对mysql数据库进行相关操作的一个库,本项目中用于将爬取数据加入到本地构建好的数据库中,以及其他的相关操作(增删改查

                        为了适用本项目较大规模数据的存放处理以及后续的使用,因此使用了数据库。

                        如果数据量不大或没有较高的数据分析需要,你也可以考虑将数据以.csv或.xlsx的格式保存(该方式直接在python源码中即可完成,可以看看其他教程

                        本项目使用本地sql数据库存放爬取数据,为方便数据库的相关使用,选用Datagrip作为IDE对数据库进行一些操作。

                Datagrip界面如下

        本实例希望实现对账号特定时间段内按关键字筛选出的所有博文的爬取,并获得博文评论评论者个人信息

        爬取的数据分博主数据博文数据博文评论数据(包含评论者的信息三种类型。因此我们需要在数据库中建立blogger_tableblog_tablecomment_table三个数据表分别存储。

        各数据表间通过索引相关联(如comment_table中一条评论数据可由索引对应到blog_table中其所属的博文数据行,以此实现数据间的联系。

       

         对每一个数据表,其内容是这样的

         生成该表结构的mysql语句如下:

           阅读本内容请先搜索requests库的基本使用,了解get请求与响应的基本概念

        1、浏览器打开微博网站(pc版,请务必登录,点开任一博主的个人界面,f12打开开发者工具。

        2、选中XHR

        3、选中该文件

        在右侧栏中找到响应,就可以得到博主的个人信息了(如screen_name、location、gender)。

        稍后我们在编写过程中使用requests包模拟浏览器得到该JSON响应文件的过程,然后获得如下图所示的JSON数据,再使用json包将该数据格式化为字典,方便获得想要的数据项。

         微博博文的响应数据包是按照一页多条blog来发送的,该响应数据包对应的文件名为

        uid这里指博主的用户id,page取不同数是不同页的博文数据包。

        下方的若干Object 每一项均为一条博文

                 点开一条博文的评论然后进入该博文的详情页,可以得到文件名为

                鼠标滚轮往下翻评论的过程中会刷新出现若干新评论的响应数据包。但值得注意的是,与上一个博文定位不同此时各数据包的区分并不是用page的增加来实现的

         该博文的评论区,除了最前面的若干评论(对应文件列表里未刷新时的唯一一个评论数据包)以外,其余评论数据包的GET请求参数都多了一项参数"max_id" (注意下列两项的GET参数区分,其中一个含有max_id参数)。

         博文的定位中,我们修改page的值然后模拟发送即可获得所有的博文内容,而此处我们无法采用同样的操作——很显然,max_id的数值不是按照page那样自增的规律。

        该如何获得该博文的所有的评论呢?我们需要解决如何获得max_id值的问题,否则我们无法正确模拟发送获得后续评论的请求。

        解决方法

        1、你会发现前一个评论数据包的响应JSON包含了一个max_id(如图),这个max_id其实是下一个评论数据包GET请求中所需的max_id值

        2、因此,只需要获取首个评论数据包的响应JSON中的max_id值,我们就可以获得第二个评论数据包,第二个评论数据包的响应JSON中又包含了一个max_id值,对应下一个评论数据包的GET请求参数,以此类推。最后一个评论数据包的响应JSON不含max_id,可以作为python脚本中该部分过程结束的判断条件。

        3、这样我们就可以获得全部的评论信息了

        该部分的采集伴随评论的采集(评论数据包会同时包含评论者的大部分个人信息)。

           以下是基本功能的实现过程,下一步会对各函数进行修改以完善。

                关于requests库的基本使用在此不做叙述,请查阅其他文章。

                1、需要传入的headers项中,我设置了如下四项以确保获得响应JSON。

                        项目中的cookie我定义为了全局变量,以方便cookie的替换,Connection项设置为close避免过多请求带来的可能异常(或许这一项并不需要

                2、requests.get()后记得进行utf8编码

                3、用json.loads()解析res,得到字典格式的json_data

                4、参照之前开发者工具中显示的层级关系,在json_data中获得需要的数据

                5、认证信息存在为空但用户是认证用户的情况需要特判(verified_type是200、220这些

verified_type的字段

-1普通用户;

0名人,

1政府,

2企业,

3媒体,

4校园,

5网站,

6应用,

7团体(机构),

8待审企业,

200初级达人,

220中高级达人,

400已故V用户。

-1为普通用户,200和220为达人用户,0为黄V用户,其它即为蓝V用户

从前述内容可以看出,博文是按照一个个json文件由服务器发给浏览器的。我们按照月份先打包所有该博主某月的所有博文(对应的一系列JSON文件,然后再根据关键字对其中需要的博文进行筛选以及进行评论的爬取。

注意,为了加快效率,我们在程序中设置了多线程。因而有task_queue.put(json_data)入队列的过程。(该处理原理是多线程任务的生产者-消费者模型

并且在爬取过程中有一定概率会请求服务器失败,我设置了重新请求的处理(retried_times

打包完成后,我们使用遍历对所有博文据关键字筛选,然后对博文信息进行写入数据库操作。

在post_json_data_insert()的尾部我们调用了post_comment_data函数进行博文下评论的爬取。需要注意的是,由于评论信息存在一个需要特别关注的max_id参数需要处理,post_comment_data采集完第一次评论数据后,后续的评论数据会调用post_comment_data_rest()函数来处理max_id问题

该程序的主功能集成函数为

自此,对代码的主要设计部分讲解结束。除此之外,脚本中还有一些边缘的函数(如日期格式化、处理文本内容采集不全的函数)。

完整代码请访问我的github项目:GitHub - otonashi-ayana/SpiderWeibo: Collect blog posts and comments, commentator information and build a database

国内的ip免费/付费代理商不接单访问微博的ip代理服务(政策原因,因而通过该方法解决微博反爬冻结ip不可行。本实例可在若干小时内采集到上十万规模的博文以及评论数据

本人代码水平堪忧,本代码中的多线程部分与异常处理非常混乱,同时该项目前后经过了很长一段时间修改,其屎山程度有目共睹。不过本实例中的一些细节问题在网络上没有查阅到相关资料,博主希望能够帮助到遇到同样问题的各位。

博文数据采集数据库的展示(549,186行数据

其中每一行评论都会记录其所属的博文id,通过博文id可以找到博文数据表中对应的博文,实现了数据之间的关联

    以上就是本篇文章【【微博爬虫教程&实例】基于requests、mysql爬取大数据量博主关键字下博文及评论】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/news/9136.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多   
最新新闻
云南网络营销软件哪个好?权威推荐助您快速选择
在数字化时代,网络营销软件成为了许多企业实现营销目标的重要工具。然而,市面上网络营销软件琳琅满目,选择一个适合自己的并不
宫崎骏的时代结束了
在《你想活出怎样的人生》之前,宫崎骏一直是著名的退休诈骗犯。七次退休又七次复出,年过八旬,创作欲还是旺盛到令人害怕。然而
个人大数据信用查询平台哪个更准确一些?蘑菇画像个人大数据信用报告查询平台更好用
个人大数据信用查询平台哪个更准确一些?蘑菇画像个人大数据信用报告查询平台更好用,个人大数据信用查询平台市面上还是比较多的
小红书关键词热度查询!国风大潮下,品牌怎么玩出花样、玩出水平?
国风,是当下年轻人钟爱的潮流。汉服穿搭、文物手办、国潮仿妆……频频出圈。“民族的就是世界的”,国风的影响力可谓深远,一说
app推广接单发布平台哪个好?怎么领取任务赚钱?
最近几年,随着互联网的快速发展,利用网络兼职的赚钱方式也呈现越来越火,非常受大众欢迎的趋势。而且其种类也非常多:微商、社
【可打印】文学常识常考100题汇总,初中生练一练!(部编版初中语文)
关注本公众号,私信发送数字:2493,领取电子打印版文学常识1、成语“万事俱备,只欠东风”是根据《三国演义》________ (战役)
“迎旅发大会 游美丽望城”望城首届文旅短视频大赛,最高3万奖励等你来拿!
湘江水浩浩奔腾,流淌沧桑巨变。铜官窑静穆肃然,在这里诉说着望城的厚重历史,流传着“君生我未生,我生君已老”凄美爱情故事;落日
mysql导入大txt文件怎么打开_mysql怎么导入txt文件?
有时候我们在使用mysql数据库的时候,想导入txt文本文档,要怎么操作呢?下面本篇文章就来给大家介绍一下方法
寸头抖音短视频教程_人开始衰老的迹象是什么
岁月不饶人,我才50出头,可是许多衰老迹象已经越来越明显,惹得中医闺蜜笑话这样的我。1、觉得右后背和肩膀疼,出现“五十肩”
什么是网站页脚:以及最佳页脚设计示例
主体内容外,网站还包括页眉和页脚,用于帮助访问者的特定目的。由于我们认为网站页脚设计同样重要,我们整理了10个最佳免费网站
本企业新闻

点击拨打: