Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

新浪微博爬虫,用python爬取新浪微博数据

Notifications You must be signed in to change notification settings

donecro/weiboSpider

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

110 Commits

Repository files navigation

功能

连续爬取一个多个新浪微博用户(如胡歌迪丽热巴郭碧婷)的数据,并将结果信息写入文件。写入信息几乎包括了用户微博的所有数据,主要有用户信息微博信息两大类,前者包含用户昵称、关注数、粉丝数、微博数等等;后者包含微博正文、发布时间、发布工具、评论数等等,因为内容太多,这里不再赘述,详细内容见输出部分。具体的写入文件类型如下:

  • 写入txt文件(默认)
  • 写入csv文件(默认)
  • 写入MySQL数据库(可选)
  • 写入MongoDB数据库(可选)
  • 下载用户微博中的原始图片(可选)
  • 下载用户微博中的视频(可选)

本程序需要设置用户cookie,以获取微博访问权限,后面会讲解如何获取cookie。如需免cookie版,大家可以访问https://github.com/dataabc/weibo-crawler,二者功能类似,免cookie版获取的信息更多,用法更简单,而且不需要cookie。

输出

本部分为爬取到的字段信息说明,为了与免cookie版区分,下面将两者爬取到的信息都列出来。如果是免cookie版所特有的信息,会有免cookie标注,没有标注的为二者共有的信息。
用户信息

  • 用户id:微博用户id,如"1669879400",其实这个字段本来就是已知字段
  • 昵称:用户昵称,如"Dear-迪丽热巴"
  • 微博数:用户的全部微博数(转发微博+原创微博)
  • 关注数:用户关注的微博数量
  • 粉丝数:用户的粉丝数
  • 性别(免cookie版):微博用户性别
  • 简介(免cookie版):用户简介
  • 主页地址(免cookie版):微博移动版主页url,如https://m.weibo.cn/u/1669879400?uid=1669879400&luicode=10000011&lfid=1005051669879400
  • 头像url(免cookie版):用户头像url
  • 高清头像url(免cookie版):用户高清头像url
  • 微博等级(免cookie版):用户微博等级
  • 会员等级(免cookie版):微博会员用户等级,普通用户该等级为0
  • 是否认证(免cookie版):用户是否认证,为布尔类型
  • 认证类型(免cookie版):用户认证类型,如个人认证、企业认证、政府认证等
  • 认证信息(免cookie版):为认证用户特有,用户信息栏显示的认证信息

微博信息

  • 微博id:微博唯一标志
  • 微博内容:微博正文
  • 原始图片url:原创微博图片和转发微博转发理由中图片的url,若某条微博存在多张图片,每个url以英文逗号分隔,若没有图片则值为"无"
  • 视频url: 微博中的视频url,若微博中没有视频,则值为"无"
  • 微博发布位置:位置微博中的发布位置
  • 微博发布时间:微博发布时的时间,精确到分
  • 点赞数:微博被赞的数量
  • 转发数:微博被转发的数量
  • 评论数:微博被评论的数量
  • 微博发布工具:微博的发布工具,如iPhone客户端、HUAWEI Mate 20 Pro等
  • 结果文件:保存在当前目录weibo文件夹下以用户昵称为名的文件夹里,名字为"user_id.csv"和"user_id.txt"的形式
  • 微博图片:原创微博中的图片和转发微博转发理由中的图片,保存在以用户昵称为名的文件夹下的img文件夹里
  • 微博视频:原创微博中的视频,保存在以用户昵称为名的文件夹下的video文件夹里
  • 微博bid(免cookie版):为免cookie版所特有,与本程序中的微博id是同一个值
  • 话题(免cookie版):微博话题,即两个#中的内容,若存在多个话题,每个url以英文逗号分隔,若没有则值为''
  • @用户(免cookie版):微博@的用户,若存在多个@用户,每个url以英文逗号分隔,若没有则值为''
  • 原始微博(免cookie版):为转发微博所特有,是转发微博中那条被转发的微博,存储为字典形式,包含了上述微博信息中的所有内容,如微博id、微博内容等等

实例

以爬取迪丽热巴的微博为例。首先,我们需要为程序设置cookie值,cookie获取及设置方法见设置cookie。迪丽热巴的微博昵称为"Dear-迪丽热巴",id为1669879400,用户id获取方法见如何获取user_id。我们选择爬取她的全部原创微博。具体方法是将weibospider.py文件的main函数主要部分修改为如下代码:

 # 以下是程序配置信息,可以根据自己需求修改
 filter = 1 # 值为0表示爬取全部微博(原创微博+转发微博),值为1表示只爬取原创微博
 since_date = '1900-01-01' # 起始时间,即爬取发布日期从该值到现在的微博,形式为yyyy-mm-dd
 """值为0代表不将结果写入MongoDB数据库,1代表写入;若要写入MongoDB数据库,
 请先安装MongoDB数据库和pymongo,pymongo安装方法为命令行运行:pip install pymongo"""
 mongodb_write = 0
 """值为0代表不将结果写入MySQL数据库,1代表写入;若要写入MySQL数据库,
 请先安装MySQL数据库和pymysql,pymysql安装方法为命令行运行:pip install pymysql"""
 mysql_write = 0
 pic_download = 1 # 值为0代表不下载微博原始图片,1代表下载微博原始图片
 video_download = 1 # 值为0代表不下载微博视频,1代表下载微博视频
 wb = Weibo(filter, since_date, mongodb_write, mysql_write,
 pic_download, video_download)
 user_id_list = ['1669879400']
 wb.start(user_id_list) # 爬取微博信息

代码具体含义注释里都有,不在赘述。设置完成后运行程序:

$ python weibospider.py

程序会自动生成一个weibo文件夹,我们以后爬取的所有微博都被存储在这里。然后程序在该文件夹下生成一个名为"Dear-迪丽热巴"的文件夹,迪丽热巴的所有微博爬取结果都在这里。"Dear-迪丽热巴"文件夹里包含一个csv文件、一个txt文件、一个img文件夹和一个video文件夹,img文件夹用来存储下载到的图片,video文件夹用来存储下载到的视频。如果你设置了保存数据库功能,这些信息也会保存在数据库里,数据库设置见设置数据库部分。

csv文件结果如下所示: 1669879400.csv

txt文件结果如下所示: 1669879400.txt

下载的图片如下所示: img文件夹
本次下载了793张图片,大小一共1.21GB,包括她原创微博中的图片和转发微博转发理由中的图片。图片名为yyyymmdd+微博id的形式,若某条微博存在多张图片,则图片名中还会包括它在微博图片中的序号。若某张图片因为网络等原因下载失败,程序则会以"weibo_id:pic_url"的形式将出错微博id和图片url写入同文件夹下的not_downloaded.txt里;

下载的视频如下所示: video文件夹
本次下载了70个视频,是她原创微博中的视频,视频名为yyyymmdd+微博id的形式。其中有一个视频因为网络原因下载失败,程序将它的微博id和视频url以"weibo_id:video_url"的形式写到了同文件夹下的not_downloaded.txt里。
因为我本地没有安装MySQL数据库和MongoDB数据库,所以暂时设置成不写入数据库。如果你想要将爬取结果写入数据库,只需要先安装数据库(MySQL或MongoDB),再安装对应包(pymysql或pymongo),然后将mysql_write或mongodb_write值设置为1即可。写入MySQL需要用户名、密码等配置信息,这些配置如何设置见设置数据库部分。

运行环境

  • 开发语言:python2/python3
  • 系统: Windows/Linux/macOS

使用说明

1.下载脚本

$ git clone https://github.com/dataabc/weibospider.git

运行上述命令,将本项目下载到当前目录,如果下载成功当前目录会出现一个名为"weibospider"的文件夹;

2.安装依赖

$ pip install -r requirements.txt

3.设置cookie

打开weibospider文件夹下的weibospider.py文件,将"your cookie"替换成爬虫微博的cookie,具体替换位置大约在weibospider.py文件的22行左右。cookie获取方法见如何获取cookie;

4.设置user_id

打开weibospider文件夹下的weibospider.py文件,将我们想要爬取的一个多个微博的user_id赋值给user_id_list,user_id获取方法见如何获取user_id。user_id设置代码位于weibospider.py的main函数里,具体代码如下:

# 爬单个微博用户,可以改成任意合法的用户id
user_id_list = ['1669879400']

或者

# 爬多个微博用户,可以改成任意合法的用户id
user_id_list = ['1223178222', '1669879400', '1729370543']

或者

"""可以在文件中读取user_id_list,文件中可以包含很多user_id,
每个user_id占一行,文件名任意,类型为txt,位置位于本程序的同目录下,
比如文件可以叫user_id_list.txt"""
user_id_list = wb.get_user_list('user_id_list.txt')

5.设置数据库(可选)

本部分是可选部分,如果不需要将爬取信息写入数据库,可跳过这一步。本程序目前支持MySQL数据库和MongoDB数据库,如果你需要写入其它数据库,可以参考这两个数据库的写法自己编写。
MySQL数据库写入
要想将爬取信息写入MySQL,请将main函数中的mysql_write变量值改为1。再根据自己的系统环境安装MySQL,然后命令行执行:

$ pip install pymysql

MySQL写入需要主机、端口号、用户名、密码等配置,本程序默认的配置如下:

 mysql_config = {
 'host': 'localhost',
 'port': 3306,
 'user': 'root',
 'password': '123456',
 'charset': 'utf8mb4'
 }

如果你的配置和上面不同,需要修改main函数,将本程序的配置改成自己的配置,具体代码如下:

 mysql_config = {
 'host': 'xxx',
 'port': xxx,
 'user': 'xxx',
 'password': 'xxx',
 'charset': 'utf8mb4'
 }
 wb.change_mysql_config(mysql_config)

MongoDB数据库写入
要想将爬取信息写入MongoDB,请将main函数中的mongodb_write变量值改为1。再根据自己的系统环境安装MongoDB,然后命令行执行:

$ pip install pymongo

MySQL和MongDB数据库的写入内容一样。程序首先会创建一个名为"weibo"的数据库,然后再创建"user"表和"weibo"表,包含爬取的所有内容。爬取到的微博用户信息或插入或更新,都会存储到user表里;爬取到的微博信息或插入或更新,都会存储到weibo表里,两个表通过user_id关联。如果想了解两个表的具体字段,请点击"详情"。

详情

user表
id:存储用户id,如"1669879400";
nickname:存储用户昵称,如"Dear-迪丽热巴";
weibo_num:存储微博数;
following:存储关注数;
followers:存储粉丝数。


weibo表
id:存储微博id;
user_id:存储微博发布者的用户id,如"1669879400";
content:存储微博正文;
original_pictures:存储原创微博的原始图片url和转发微博转发理由中的图片url。若某条微博有多张图片,则存储多个url,以英文逗号分割;若某微博没有图片,则值为"无";
retweet_pictures:存储被转发微博中的原始图片url。当最新微博为原创微博或者为没有图片的转发微博时,则值为"无",否则为被转发微博的图片url。若有多张图片,则存储多个url,以英文逗号分割;
publish_place:存储微博的发布位置。如果某条微博没有位置信息,则值为"无";
publish_time:存储微博的发布时间;
up_num:存储微博获得的点赞数;
retweet_num:存储微博获得的转发数;
comment_num:存储微博获得的评论数;
publish_tool:存储微博的发布工具。

6.运行脚本

大家可以根据自己的运行环境选择运行方式,Linux可以通过

$ python weibospider.py

运行;

7.按需求修改脚本(可选)

本程序是一个Weibo类,用户可以按照自己的需求调用Weibo类。 用户可以直接在weibospider.py文件中调用Weibo类,具体调用代码示例如下:

 # 以下是程序配置信息,可以根据自己需求修改
 filter = 1 # 值为0表示爬取全部微博(原创微博+转发微博),值为1表示只爬取原创微博
 since_date = '2019-07-01' # 起始时间,即爬取发布日期从该值到现在的微博,形式为yyyy-mm-dd
 """值为0代表不将结果写入MongoDB数据库,1代表写入;若要写入MongoDB数据库,
 请先安装MongoDB数据库和pymongo,pymongo安装方法为命令行运行:pip install pymongo"""
 mongodb_write = 1
 """值为0代表不将结果写入MySQL数据库,1代表写入;若要写入MySQL数据库,
 请先安装MySQL数据库和pymysql,pymysql安装方法为命令行运行:pip install pymysql"""
 mysql_write = 1
 pic_download = 0 # 值为0代表不下载微博原始图片,1代表下载微博原始图片
 video_download = 0 # 值为0代表不下载微博视频,1代表下载微博视频
 wb = Weibo(filter, since_date, mongodb_write, mysql_write,
 pic_download, video_download)
 # 下面是自定义MySQL数据库连接配置(可选)
 """因为操作MySQL数据库需要用户名、密码等参数,本程序默认为:
 mysql_config = {
 'host': 'localhost',
 'port': 3306,
 'user': 'root',
 'password': '123456',
 'charset': 'utf8mb4'
 }
 大家的参数配置如果和默认值不同,可以将上面的参数值替换成自己的,
 然后添加如下代码,使修改生效,如果你的参数和默认值相同则不需要下面的代码:
 wb.change_mysql_config(mysql_config)"""
 # 下面是配置user_id_list
 """user_id_list包含了要爬的目标微博id,可以是一个,也可以是多个,也可以从文件中读取
 爬单个微博,user_id_list如下所示,可以改成任意合法的用户id
 user_id_list = ['1669879400']
 爬多个微博,user_id_list如下所示,可以改成任意合法的用户id
 user_id_list = ['1223178222', '1669879400', '1729370543']
 也可以在文件中读取user_id_list,文件中可以包含很多user_id,
 每个user_id占一行,文件名任意,类型为txt,位置位于本程序的同目录下,
 比如文件可以叫user_id_list.txt,读取文件中的user_id_list如下所示:
 user_id_list = wb.get_user_list('user_id_list.txt')"""
 user_id_list = ['1223178222', '1669879400', '1729370543']
 wb.start(user_id_list) # 爬取微博信息

通过执行wb.start() 完成了微博的爬取工作。在上述代码执行后,我们可以得到很多信息:
wb.nickname:用户昵称;
wb.weibo_num:微博数;
wb.following:关注数;
wb.followers:粉丝数;
wb.weibo:除不包含上述信息外,wb.weibo包含爬取到的所有微博信息,如微博id微博正文原始图片url发布位置发布时间发布工具点赞数转发数评论数等。如果爬的是全部微博(原创+转发),除上述信息之外,还包含被转发微博原始图片url是否为原创微博等。wb.weibo是一个列表,包含了爬取的所有微博信息。wb.weibo[0]为爬取的第一条微博,wb.weibo[1]为爬取的第二条微博,以此类推。当filter=1时,wb.weibo[0]为爬取的第一条原创微博,以此类推。wb.weibo[0]['id']为第一条微博的id,wb.weibo[0]['content']为第一条微博的正文,wb.weibo[0]['publish_time']为第一条微博的发布时间,还有其它很多信息不在赘述,大家可以点击下面的"详情"查看具体用法。

详情

若目标微博用户存在微博,则:
id:存储微博id。如wb.weibo[0]['id']为最新一条微博的id;
content:存储微博正文。如wb.weibo[0]['content']为最新一条微博的正文;
original_pictures:存储原创微博的原始图片url和转发微博转发理由中的图片url。如wb.weibo[0]['original_pictures']为最新一条微博的原始图片url,若该条微博有多张图片,则存储多个url,以英文逗号分割;若该微博没有图片,则值为"无";
retweet_pictures:存储被转发微博中的原始图片url。当最新微博为原创微博或者为没有图片的转发微博时,则值为"无",否则为被转发微博的图片url。若有多张图片,则存储多个url,以英文逗号分割;
publish_place:存储微博的发布位置。如wb.weibo[0]['publish_place']为最新一条微博的发布位置,如果该条微博没有位置信息,则值为"无";
publish_time:存储微博的发布时间。如wb.weibo[0]['publish_time']为最新一条微博的发布时间;
up_num:存储微博获得的点赞数。如wb.weibo[0]['up_num']为最新一条微博获得的点赞数;
retweet_num:存储微博获得的转发数。如wb.weibo[0]['retweet_num']为最新一条微博获得的转发数;
comment_num:存储微博获得的评论数。如wb.weibo[0]['comment_num']为最新一条微博获得的评论数;
publish_tool:存储微博的发布工具。如wb.weibo[0]['publish_tool']为最新一条微博的发布工具。

如何获取cookie

1.用Chrome打开https://passport.weibo.cn/signin/login;
2.输入微博的用户名、密码,登录,如图所示: 登录成功后会跳转到https://m.weibo.cn;
3.按F12键打开Chrome开发者工具,在地址栏输入并跳转到https://weibo.cn,跳转后会显示如下类似界面: 4.依此点击Chrome开发者工具中的Network->Name中的weibo.cn->Headers->Request Headers,"Cookie:"后的值即为我们要找的cookie值,复制即可,如图所示:

如何获取user_id

1.打开网址https://weibo.cn,搜索我们要找的人,如"迪丽热巴",进入她的主页;
2.按照上图箭头所指,点击"资料"链接,跳转到用户资料页面;
如上图所示,迪丽热巴微博资料页的地址为"https://weibo.cn/1669879400/info",其中的"1669879400"即为此微博的user_id。
事实上,此微博的user_id也包含在用户主页(https://weibo.cn/u/1669879400?f=search_0)中,之所以我们还要点击主页中的"资料"来获取user_id,是因为很多用户的主页不是"https://weibo.cn/user_id?f=search_0"的形式,而是"https://weibo.cn/个性域名?f=search_0"或"https://weibo.cn/微号?f=search_0"的形式。其中"微号"和user_id都是一串数字,如果仅仅通过主页地址提取user_id,很容易将"微号"误认为user_id。

注意事项

1.user_id不能为爬虫微博的user_id。因为要爬微博信息,必须先登录到某个微博账号,此账号我们姑且称为爬虫微博。爬虫微博访问自己的页面和访问其他用户的页面,得到的网页格式不同,所以无法爬取自己的微博信息;
2.cookie有期限限制,超过有效期需重新更新cookie。

About

新浪微博爬虫,用python爬取新浪微博数据

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%

AltStyle によって変換されたページ (->オリジナル) /