Git Product home page Git Product logo

weibo-crawler's Introduction

功能

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

  • 写入csv文件(默认)
  • 写入json文件(可选)
  • 写入MySQL数据库(可选)
  • 写入MongoDB数据库(可选)
  • 写入SQLite数据库(可选)
  • 下载用户原创微博中的原始图片(可选)
  • 下载用户转发微博中的原始图片(可选)
  • 下载用户原创微博中的视频(可选)
  • 下载用户转发微博中的视频(可选)
  • 下载用户原创微博Live Photo中的视频(可选)
  • 下载用户转发微博Live Photo中的视频(可选)
  • 下载用户原创和转发微博下的一级评论(可选)
  • 下载用户原创和转发微博下的转发(可选)

如果你只对用户信息感兴趣,而不需要爬用户的微博,也可以通过设置实现只爬取微博用户信息的功能。程序也可以实现爬取结果自动更新,即:现在爬取了目标用户的微博,几天之后,目标用户可能又发新微博了。通过设置,可以实现每隔几天增量爬取用户这几天发的新微博。具体方法见定期自动爬取微博

输出

用户信息

  • 用户id:微博用户id,如"1669879400"
  • 用户昵称:微博用户昵称,如"Dear-迪丽热巴"
  • 性别:微博用户性别
  • 生日:用户出生日期
  • 所在地:用户所在地
  • 教育经历:用户上学时学校的名字
  • 公司:用户所属公司名字
  • 阳光信用:用户的阳光信用
  • 微博注册时间:用户微博注册日期
  • 微博数:用户的全部微博数(转发微博+原创微博)
  • 粉丝数:用户的粉丝数
  • 关注数:用户关注的微博数量
  • 简介:用户简介
  • 主页地址:微博移动版主页url,如https://m.weibo.cn/u/1669879400?uid=1669879400&luicode=10000011&lfid=1005051669879400
  • 头像url:用户头像url
  • 高清头像url:用户高清头像url
  • 微博等级:用户微博等级
  • 会员等级:微博会员用户等级,普通用户该等级为0
  • 是否认证:用户是否认证,为布尔类型
  • 认证类型:用户认证类型,如个人认证、企业认证、政府认证等
  • 认证信息:为认证用户特有,用户信息栏显示的认证信息

微博信息

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

实例

以爬取迪丽热巴的微博为例,我们需要修改config.json文件,文件内容如下:

{
    "user_id_list": ["1669879400"],
    "only_crawl_original": 1,
    "since_date": "1900-01-01",
    "query_list": [],
    "write_mode": ["csv"],
    "original_pic_download": 1,
    "retweet_pic_download": 0,
    "original_video_download": 1,
    "retweet_video_download": 0,
    "cookie": "your cookie"
}

对于上述参数的含义以及取值范围,这里仅作简单介绍,详细信息见程序设置

user_id_list代表我们要爬取的微博用户的user_id,可以是一个或多个,也可以是文件路径,微博用户Dear-迪丽热巴的user_id为1669879400,具体如何获取user_id见如何获取user_idonly_crawl_original的值为1代表爬取全部原创微博,值为0代表爬取全部微博(原创+转发); since_date代表我们要爬取since_date日期之后发布的微博,因为我要爬迪丽热巴的全部原创微博,所以since_date设置了一个非常早的值; query_list代表要爬取的微博关键词,为空([])则爬取全部; write_mode代表结果文件的保存类型,我想要把结果写入csv文件和json文件,所以它的值为["csv", "json"],如果你想写入数据库,具体设置见设置数据库original_pic_download值为1代表下载原创微博中的图片,值为0代表不下载; retweet_pic_download值为1代表下载转发微博中的图片,值为0代表不下载; original_video_download值为1代表下载原创微博中的视频,值为0代表不下载; retweet_video_download值为1代表下载转发微博中的视频,值为0代表不下载; cookie是可选参数,可填可不填,具体区别见添加cookie与不添加cookie的区别

配置完成后运行程序:

python weibo.py

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

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

本csv文件是爬取“全部微博”(原创微博+转发微博)的结果文件。因为迪丽热巴很多微博本身都没有图片、发布工具、位置、话题和@用户等信息,所以当这些内容没有时对应位置为空。"是否原创"列用来标记是否为原创微博, 当为转发微博时,文件中还包含转发微博的信息。为了简便起见,姑且将转发微博中被转发的原始微博称为源微博,它的用户id、昵称、微博id等都在名称前加上源字,以便与目标用户自己发的微博区分。对于转发微博,程序除了获取用户原创部分的信息,还会获取源用户id源用户昵称源微博id源微博正文源微博原始图片url源微博位置源微博日期源微博工具源微博点赞数源微博评论数源微博转发数源微博话题源微博@用户等信息。原创微博因为没有这些转发信息,所以对应位置为空。若爬取的是"全部原创微博",则csv文件中不会包含"是否原创"及其之后的转发属性列;

为了说明json结果文件格式,这里以迪丽热巴2019年12月27日到2019年12月28日发的2条微博为例。

json结果文件格式如下:

{
    "user": {
        "id": "1669879400",
        "screen_name": "Dear-迪丽热巴",
        "gender": "f",
        "birthday": "双子座",
        "location": "上海",
        "education": "上海戏剧学院",
        "company": "嘉行传媒",
        "registration_time": "2010-07-02",
        "sunshine": "信用极好",
        "statuses_count": 1121,
        "followers_count": 66395881,
        "follow_count": 250,
        "description": "一只喜欢默默表演的小透明。工作联系[email protected] 🍒",
        "profile_url": "https://m.weibo.cn/u/1669879400?uid=1669879400&luicode=10000011&lfid=1005051669879400",
        "profile_image_url": "https://tvax2.sinaimg.cn/crop.0.0.1080.1080.180/63885668ly8gb5sqc19mqj20u00u0mz5.jpg?KID=imgbed,tva&Expires=1584108150&ssig=Zay1N7KhK1",
        "avatar_hd": "https://wx2.sinaimg.cn/orj480/63885668ly8gb5sqc19mqj20u00u0mz5.jpg",
        "urank": 44,
        "mbrank": 7,
        "verified": true,
        "verified_type": 0,
        "verified_reason": "嘉行传媒签约演员 "
    },
    "weibo": [
        {
            "user_id": 1669879400,
            "screen_name": "Dear-迪丽热巴",
            "id": 4454572602912349,
            "bid": "ImTGkcdDn",
            "text": "今天的#星光大赏#  ",
            "pics": "https://wx3.sinaimg.cn/large/63885668ly1gacppdn1nmj21yi2qp7wk.jpg,https://wx4.sinaimg.cn/large/63885668ly1gacpphkj5gj22ik3t0b2d.jpg,https://wx4.sinaimg.cn/large/63885668ly1gacppb4atej22yo4g04qr.jpg,https://wx2.sinaimg.cn/large/63885668ly1gacpn0eeyij22yo4g04qr.jpg",
            "video_url": "",
            "location": "",
            "created_at": "2019-12-28",
            "source": "",
            "attitudes_count": 551894,
            "comments_count": 182010,
            "reposts_count": 1000000,
            "topics": "星光大赏",
            "at_users": ""
        },
        {
            "user_id": 1669879400,
            "screen_name": "Dear-迪丽热巴",
            "id": 4454081098040623,
            "bid": "ImGTzxJJt",
            "text": "我最爱用的娇韵诗双萃精华穿上限量“金”装啦,希望阿丝儿们跟我一起在新的一年更美更年轻,喜笑颜开没有细纹困扰!限定新春礼盒还有祝福悄悄话,大家了解一下~",
            "pics": "",
            "video_url": "",
            "location": "",
            "created_at": "2019-12-27",
            "source": "",
            "attitudes_count": 190840,
            "comments_count": 43523,
            "reposts_count": 1000000,
            "topics": "",
            "at_users": "",
            "retweet": {
                "user_id": 1684832145,
                "screen_name": "法国娇韵诗",
                "id": 4454028484570123,
                "bid": "ImFwIjaTF",
                "text": "#点萃成金 年轻焕新# 将源自天然的植物力量,转化为滴滴珍贵如金的双萃精华。这份点萃成金的独到匠心,只为守护娇粉们的美丽而来。点击视频,与@Dear-迪丽热巴 一同邂逅新年限量版黄金双萃,以闪耀开运金,送上新春宠肌臻礼。 跟着迪迪选年货,还有双重新春惊喜,爱丽丝们看这里! 第一重参与微淘活动邀请好友关注娇韵诗天猫旗舰店,就有机会赢取限量款热巴新年礼盒,打开就能聆听仙女迪亲口送出的新春祝福哦!点击网页链接下单晒热巴同款黄金双萃,并且@法国娇韵诗,更有机会获得热巴亲笔签名的礼盒哦! 第二重转评说出新年希望娇韵诗为你解决的肌肤愿望,截止至1/10,小娇将从铁粉中抽取1位娇粉送出限量版热巴定制礼盒,抽取3位娇粉送出热巴明信片1张~ #迪丽热巴代言娇韵诗#养成同款御龄美肌,就从现在开始。法国娇韵诗的微博视频",
                "pics": "",
                "video_url": "http://f.video.weibocdn.com/003vQjnRlx07zFkxIMjS010412003bNx0E010.mp4?label=mp4_hd&template=852x480.25.0&trans_finger=62b30a3f061b162e421008955c73f536&Expires=1578322522&ssig=P3ozrNA3mv&KID=unistore,video",
                "location": "",
                "created_at": "2019-12-27",
                "source": "微博 weibo.com",
                "attitudes_count": 18389,
                "comments_count": 3201,
                "reposts_count": 1000000,
                "topics": "点萃成金 年轻焕新,迪丽热巴代言娇韵诗",
                "at_users": "Dear-迪丽热巴,法国娇韵诗"
            }
        }
    ]
}

1669879400.json

下载的图片如下所示:

img文件夹

本次下载了788张图片,大小一共1.21GB,包括她原创微博中的所有图片。图片名为yyyymmdd+微博id的形式,若某条微博存在多张图片,则图片名中还会包括它在微博图片中的序号。若某图片下载失败,程序则会以“weibo_id:pic_url”的形式将出错微博id和图片url写入同文件夹下的not_downloaded.txt里;若图片全部下载成功则不会生成not_downloaded.txt;

下载的视频如下所示: video文件夹

本次下载了66个视频,是她原创微博中的视频和原创微博Live Photo中的视频,视频名为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/weibo-crawler.git

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

2.安装依赖

pip install -r requirements.txt

3.程序设置

打开config.json文件,你会看到如下内容:

{
    "user_id_list": ["1669879400"],
    "only_crawl_original": 1,
    "remove_html_tag": 1,
    "since_date": "2018-01-01",
    "write_mode": ["csv"],
    "original_pic_download": 1,
    "retweet_pic_download": 0,
    "original_video_download": 1,
    "retweet_video_download": 0,
    "download_comment":1,
    "comment_max_download_count":1000,
    "download_repost": 1,
    "repost_max_download_count": 1000,
    "user_id_as_folder_name": 0,
    "cookie": "your cookie",
    "mysql_config": {
        "host": "localhost",
        "port": 3306,
        "user": "root",
        "password": "123456",
        "charset": "utf8mb4"
    },
    "mongodb_URI": "mongodb://[username:password@]host[:port][/[defaultauthdb][?options]]",
    "post_config": {
        "api_url": "https://api.example.com",
        "api_token": ""
    }
}

下面讲解每个参数的含义与设置方法。

设置user_id_list

user_id_list是我们要爬取的微博的id,可以是一个,也可以是多个,例如:

"user_id_list": ["1223178222", "1669879400", "1729370543"],

上述代码代表我们要连续爬取user_id分别为“1223178222”、 “1669879400”、 “1729370543”的三个用户的微博,具体如何获取user_id见如何获取user_id

user_id_list的值也可以是文件路径,我们可以把要爬的所有微博用户的user_id都写到txt文件里,然后把文件的位置路径赋值给user_id_list。

在txt文件中,每个user_id占一行,也可以在user_id后面加注释(可选),如用户昵称等信息,user_id和注释之间必需要有空格,文件名任意,类型为txt,位置位于本程序的同目录下,文件内容示例如下:

1223178222 胡歌
1669879400 迪丽热巴
1729370543 郭碧婷

假如文件叫user_id_list.txt,则user_id_list设置代码为:

"user_id_list": "user_id_list.txt",

设置only_crawl_original

only_crawl_original控制爬取范围,值为1代表爬取全部原创微博,值为0代表爬取全部微博(原创+转发)。例如,如果要爬全部原创微博,请使用如下代码:

"only_crawl_original": 1,

设置since_date

since_date值可以是日期,也可以是整数。如果是日期,代表爬取该日期之后的微博,格式应为“yyyy-mm-dd”,如:

"since_date": "2018-01-01",

代表爬取从2018年1月1日到现在的微博。

如果是整数,代表爬取最近n天的微博,如:

"since_date": 10,

代表爬取最近10天的微博,这个说法不是特别准确,准确说是爬取发布时间从10天前到本程序开始执行时之间的微博。

since_date是所有user的爬取起始时间,非常不灵活。如果你要爬多个用户,并且想单独为每个用户设置一个since_date,可以使用定期自动爬取微博方法二中的方法,该方法可以为多个用户设置不同的since_date,非常灵活

设置query_list(可选)

query_list是一个关键词字符串列表或以,分隔关键词的字符串,用于指定关键词搜索爬取,若为空[]""则爬取全部微博。例如要爬取用户包含“梦想”和“希望”的微博,则设定如下:

"query_list": ["梦想","希望"],
"query_list": "梦想,希望",

请注意,关键词搜索必须设定cookie信息。 query_list是所有user的爬取关键词,非常不灵活。如果你要爬多个用户,并且想单独为每个用户设置一个query_list,可以使用定期自动爬取微博方法二中的方法,该方法可以为多个用户设置不同的query_list,非常灵活

设置remove_html_tag

remove_html_tag控制是否移除抓取到的weibo正文和评论中的html tag,值为1代表移除,值为0代表不移除,如

"remove_html_tag": 1,

代表移除html tag。例如专属新意,色彩启程~<a href='/n/路易威登'>@路易威登</a> CAPUCINES 手袋正合我意,打开灵感包袋的搭配新方式!会被处理成专属新意,色彩启程~@路易威登 CAPUCINES 手袋正合我意,打开灵感包袋的搭配新方式!

设置write_mode

write_mode控制结果文件格式,取值范围是csv、json、post、mongo、mysql和sqlite,分别代表将结果写入csv、json文件,通过POST发出,MongoDB、MySQL和SQLite数据库。write_mode可以同时包含这些取值中的一个或几个,如:

"write_mode": ["csv", "json"],

代表将结果信息写入csv文件和json文件。特别注意,如果你想写入数据库,除了在write_mode添加对应数据库的名字外,还应该安装相关数据库和对应python模块,具体操作见设置数据库部分。

设置original_pic_download

original_pic_download控制是否下载原创微博中的图片,值为1代表下载,值为0代表不下载,如

"original_pic_download": 1,

代表下载原创微博中的图片。

设置retweet_pic_download

retweet_pic_download控制是否下载转发微博中的图片,值为1代表下载,值为0代表不下载,如

"retweet_pic_download": 0,

代表不下载转发微博中的图片。特别注意,本设置只有在爬全部微博(原创+转发),即only_crawl_original值为0时生效,否则程序会跳过转发微博的图片下载。

设置original_video_download

original_video_download控制是否下载原创微博中的视频和原创微博Live Photo中的视频,值为1代表下载,值为0代表不下载,如

"original_video_download": 1,

代表下载原创微博中的视频和原创微博Live Photo中的视频。

设置retweet_video_download

retweet_video_download控制是否下载转发微博中的视频和转发微博Live Photo中的视频,值为1代表下载,值为0代表不下载,如

"retweet_video_download": 0,

代表不下载转发微博中的视频和转发微博Live Photo中的视频。特别注意,本设置只有在爬全部微博(原创+转发),即only_crawl_original值为0时生效,否则程序会跳过转发微博的视频下载。

设置user_id_as_folder_name

user_id_as_folder_name控制结果文件的目录名,可取值为0和1,默认为0:

"user_id_as_folder_name": 0,

值为0,表示将结果文件保存在以用户昵称为名的文件夹里,这样结果更清晰;值为1表示将结果文件保存在以用户id为名的文件夹里,这样能保证多次爬取的一致性,因为用户昵称可变,用户id不可变。

设置download_comment

download_comment控制是否下载每条微博下的一级评论(不包括对评论的评论),仅当write_mode中有sqlite时有效,可取值为0和1,默认为1:

"download_comment": 1,

值为1,表示下载微博评论;值为0,表示不下载微博评论。

设置comment_max_download_count

comment_max_download_count控制下载评论的最大数量,仅当write_mode中有sqlite时有效,默认为1000:

"comment_max_download_count": 1000,

设置download_repost

download_repost控制是否下载每条微博下的转发,仅当write_mode中有sqlite时有效,可取值为0和1,默认为1:

"download_repost": 1,

值为1,表示下载微博转发;值为0,表示不下载微博转发。

设置repost_max_download_count

repost_max_download_count控制下载转发的最大数量,仅当write_mode中有sqlite时有效,默认为1000:

"repost_max_download_count": 1000,

值为1000,表示最多下载每条微博下的1000条转发。

设置cookie(可选)

cookie为可选参数,即可填可不填,具体区别见添加cookie与不添加cookie的区别。cookie默认配置如下:

"cookie": "your cookie",

如果想要设置cookie,可以按照如何获取cookie中的方法,获取cookie,并将上面的"your cookie"替换成真实的cookie即可。

设置mysql_config(可选)

mysql_config控制mysql参数配置。如果你不需要将结果信息写入mysql,这个参数可以忽略,即删除或保留都无所谓;如果你需要写入mysql且config.json文件中mysql_config的配置与你的mysql配置不一样,请将该值改成你自己mysql中的参数配置。

设置mongodb_URI(可选)

mongodb_URI是mongodb的连接字符串。如果你不需要将结果信息写入mongodb,这个参数可以忽略,即删除或保留都无所谓;如果你需要写入mongodb,则需要配置为完整的mongodb URI

设置start_page(可选)

start_page为爬取微博的初始页数,默认参数为1,即从所爬取用户的当前第一页微博内容开始爬取。 若在大批量爬取微博时出现中途被限制中断的情况,可通过查看csv文件内目前已爬取到的微博数除以10,向下取整后的值即为中断页数,手动设置start_page参数为中断页数,重新运行即可从被中断的节点继续爬取剩余微博内容。

4.设置数据库(可选)

本部分是可选部分,如果不需要将爬取信息写入数据库,可跳过这一步。本程序目前支持MySQL数据库和MongoDB数据库,如果你需要写入其它数据库,可以参考这两个数据库的写法自己编写。

MySQL数据库写入

要想将爬取信息写入MySQL,请根据自己的系统环境安装MySQL,然后命令行执行:

pip install pymysql

MongoDB数据库写入

要想将爬取信息写入MongoDB,请根据自己的系统环境安装MongoDB,然后命令行执行:

pip install pymongo

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

详情

user

id:微博用户id,如"1669879400";

screen_name:微博用户昵称,如"Dear-迪丽热巴";

gender:微博用户性别,取值为f或m,分别代表女和男;

birthday:生日;

location:所在地;

education:教育经历;

company:公司;

sunshine:阳光信用;

registration_time:注册时间;

statuses_count:微博数;

followers_count:粉丝数;

follow_count:关注数;

description:微博简介;

profile_url:微博主页,如https://m.weibo.cn/u/1669879400?uid=1669879400&luicode=10000011&lfid=1005051669879400;

profile_image_url:微博头像url;

avatar_hd:微博高清头像url;

urank:微博等级;

mbrank:微博会员等级,普通用户会员等级为0;

verified:微博是否认证,取值为true和false;

verified_type:微博认证类型,没有认证值为-1,个人认证值为0,企业认证值为2,政府认证值为3,这些类型仅是个人猜测,应该不全,大家可以根据实际情况判断;

verified_reason:微博认证信息,只有认证用户拥有此属性。


weibo

user_id:存储微博用户id,如"1669879400";

screen_name:存储微博昵称,如"Dear-迪丽热巴";

id:存储微博id;

text:存储微博正文;

article_url:存储微博中头条文章的url,如果微博中存在头条文章,就获取该头条文章的url,否则该值为'';

pics:存储原创微博的原始图片url。若某条微博有多张图片,则存储多个url,以英文逗号分割;若该微博没有图片,则值为'';

video_url:存储原创微博的视频url和Live Photo中的视频url。若某条微博有多个视频,则存储多个url,以英文分号分割;若该微博没有视频,则值为'';

location:存储微博的发布位置。若某条微博没有位置信息,则值为'';

created_at:存储微博的发布时间;

source:存储微博的发布工具;

attitudes_count:存储微博获得的点赞数;

comments_count:存储微博获得的评论数;

reposts_count:存储微博获得的转发数;

topics:存储微博话题,即两个#中的内容。若某条微博没有话题信息,则值为'';

at_users:存储微博@的用户。若某条微博没有@的用户,则值为'';

retweet_id:存储转发微博中原始微博的微博id。若某条微博为原创微博,则值为''。

**SQLite数据库写入**

脚本会自动建立并配置数据库文件weibodata.db

5.运行脚本

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

python weibo.py

运行;

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

本部分为可选部分,如果你不需要自己修改代码或添加新功能,可以忽略此部分。

本程序所有代码都位于weibo.py文件,程序主体是一个Weibo类,上述所有功能都是通过在main函数调用Weibo类实现的,默认的调用代码如下:

        if not os.path.isfile('./config.json'):
            sys.exit(u'当前路径:%s 不存在配置文件config.json' %
                     (os.path.split(os.path.realpath(__file__))[0] + os.sep))
        with open('./config.json') as f:
            config = json.loads(f.read())
        wb = Weibo(config)
        wb.start()  # 爬取微博信息

用户可以按照自己的需求调用或修改Weibo类。

通过执行本程序,我们可以得到很多信息:

wb.user:存储目标微博用户信息;

wb.user包含爬取到的微博用户信息,如用户id用户昵称性别生日所在地教育经历公司阳光信用微博注册时间微博数粉丝数关注数简介主页地址头像url高清头像url微博等级会员等级是否认证认证类型认证信息等,大家可以点击"详情"查看具体用法。

详情

id:微博用户id,取值方式为wb.user['id'],由一串数字组成;

screen_name:微博用户昵称,取值方式为wb.user['screen_name'];

gender:微博用户性别,取值方式为wb.user['gender'],取值为f或m,分别代表女和男;

birthday:微博用户生日,取值方式为wb.user['birthday'],若用户没有填写该信息,则值为'';

location:微博用户所在地,取值方式为wb.user['location'],若用户没有填写该信息,则值为'';

education:微博用户上学时的学校,取值方式为wb.user['education'],若用户没有填写该信息,则值为'';

company:微博用户所属的公司,取值方式为wb.user['company'],若用户没有填写该信息,则值为'';

sunshine:微博用户的阳光信用,取值方式为wb.user['sunshine'];

registration_time:微博用户的注册时间,取值方式为wb.user['registration_time'];

statuses_count:微博数,取值方式为wb.user['statuses_count'];

followers_count:微博粉丝数,取值方式为wb.user['followers_count'];

follow_count:微博关注数,取值方式为wb.user['follow_count'];

description:微博简介,取值方式为wb.user['description'];

profile_url:微博主页,取值方式为wb.user['profile_url'];

profile_image_url:微博头像url,取值方式为wb.user['profile_image_url'];

avatar_hd:微博高清头像url,取值方式为wb.user['avatar_hd'];

urank:微博等级,取值方式为wb.user['urank'];

mbrank:微博会员等级,取值方式为wb.user['mbrank'],普通用户会员等级为0;

verified:微博是否认证,取值方式为wb.user['verified'],取值为true和false;

verified_type:微博认证类型,取值方式为wb.user['verified_type'],没有认证值为-1,个人认证值为0,企业认证值为2,政府认证值为3,这些类型仅是个人猜测,应该不全,大家可以根据实际情况判断;

verified_reason:微博认证信息,取值方式为wb.user['verified_reason'],只有认证用户拥有此属性。

wb.weibo:存储爬取到的所有微博信息;

wb.weibo包含爬取到的所有微博信息,如微博id正文原始图片url视频url位置日期发布工具点赞数转发数评论数话题@用户等。如果爬的是全部微博(原创+转发),除上述信息之外,还包含原始用户id原始用户昵称原始微博id原始微博正文原始微博原始图片url原始微博位置原始微博日期原始微博工具原始微博点赞数原始微博评论数原始微博转发数原始微博话题原始微博@用户等信息。wb.weibo是一个列表,包含了爬取的所有微博信息。wb.weibo[0]为爬取的第一条微博,wb.weibo[1]为爬取的第二条微博,以此类推。当only_crawl_original=1时,wb.weibo[0]为爬取的第一条原创微博,以此类推。wb.weibo[0]['id']为第一条微博的id,wb.weibo[0]['text']为第一条微博的正文,wb.weibo[0]['created_at']为第一条微博的发布时间,还有其它很多信息不在赘述,大家可以点击下面的"详情"查看具体用法。

详情

user_id:存储微博用户id。如wb.weibo[0]['user_id']为最新一条微博的用户id;

screen_name:存储微博昵称。如wb.weibo[0]['screen_name']为最新一条微博的昵称;

id:存储微博id。如wb.weibo[0]['id']为最新一条微博的id;

text:存储微博正文。如wb.weibo[0]['text']为最新一条微博的正文;

article_url:存储微博中头条文章的url。如wb.weibo[0]['article_url']为最新一条微博的头条文章url,若微博中不存在头条文章,则该值为'';

pics:存储原创微博的原始图片url。如wb.weibo[0]['pics']为最新一条微博的原始图片url,若该条微博有多张图片,则存储多个url,以英文逗号分割;若该微博没有图片,则值为'';

video_url:存储原创微博的视频url和原创微博Live Photo中的视频url。如wb.weibo[0]['video_url']为最新一条微博的视频url,若该条微博有多个视频,则存储多个url,以英文分号分割;若该微博没有视频,则值为'';

location:存储微博的发布位置。如wb.weibo[0]['location']为最新一条微博的发布位置,若该条微博没有位置信息,则值为'';

created_at:存储微博的发布时间。如wb.weibo[0]['created_at']为最新一条微博的发布时间;

source:存储微博的发布工具。如wb.weibo[0]['source']为最新一条微博的发布工具;

attitudes_count:存储微博获得的点赞数。如wb.weibo[0]['attitudes_count']为最新一条微博获得的点赞数;

comments_count:存储微博获得的评论数。如wb.weibo[0]['comments_count']为最新一条微博获得的评论数;

reposts_count:存储微博获得的转发数。如wb.weibo[0]['reposts_count']为最新一条微博获得的转发数;

topics:存储微博话题,即两个#中的内容。如wb.weibo[0]['topics']为最新一条微博的话题,若该条微博没有话题信息,则值为'';

at_users:存储微博@的用户。如wb.weibo[0]['at_users']为最新一条微博@的用户,若该条微博没有@的用户,则值为'';

retweet:存储转发微博中原始微博的全部信息。假如wb.weibo[0]为转发微博,则wb.weibo[0]['retweet']为该转发微博的原始微博,它存储的属性与wb.weibo[0]一样,只是没有retweet属性;若该条微博为原创微博,则wb[0]没有"retweet"属性,大家可以点击"详情"查看具体用法。

详情

假设爬取到的第i条微博为转发微博,则它存在以下信息:

user_id:存储原始微博用户id。wb.weibo[i-1]['retweet']['user_id']为该原始微博的用户id;

screen_name:存储原始微博昵称。wb.weibo[i-1]['retweet']['screen_name']为该原始微博的昵称;

id:存储原始微博id。wb.weibo[i-1]['retweet']['id']为该原始微博的id;

text:存储原始微博正文。wb.weibo[i-1]['retweet']['text']为该原始微博的正文;

article_url:存储原始微博中头条文章的url。如wb.weibo[i-1]['retweet']['article_url']为该原始微博的头条文章url,若原始微博中不存在头条文章,则该值为'';

pics:存储原始微博的原始图片url。wb.weibo[i-1]['retweet']['pics']为该原始微博的原始图片url,若该原始微博有多张图片,则存储多个url,以英文逗号分割;若该原始微博没有图片,则值为'';

video_url:存储原始微博的视频url和原始微博Live Photo中的视频url。如wb.weibo[i-1]['retweet']['video_url']为该原始微博的视频url,若该原始微博有多个视频,则存储多个url,以英文分号分割;若该微博没有视频,则值为'';

location:存储原始微博的发布位置。wb.weibo[i-1]['retweet']['location']为该原始微博的发布位置,若该原始微博没有位置信息,则值为'';

created_at:存储原始微博的发布时间。wb.weibo[i-1]['retweet']['created_at']为该原始微博的发布时间;

source:存储原始微博的发布工具。wb.weibo[i-1]['retweet']['source']为该原始微博的发布工具;

attitudes_count:存储原始微博获得的点赞数。wb.weibo[i-1]['retweet']['attitudes_count']为该原始微博获得的点赞数;

comments_count:存储原始微博获得的评论数。wb.weibo[i-1]['retweet']['comments_count']为该原始微博获得的评论数;

reposts_count:存储原始微博获得的转发数。wb.weibo[i-1]['retweet']['reposts_count']为该原始微博获得的转发数;

topics:存储原始微博话题,即两个#中的内容。wb.weibo[i-1]['retweet']['topics']为该原始微博的话题,若该原始微博没有话题信息,则值为'';

at_users:存储原始微博@的用户。wb.weibo[i-1]['retweet']['at_users']为该原始微博@的用户,若该原始微博没有@的用户,则值为''。

7.定期自动爬取微博(可选)

我们爬取了微博以后,很多微博账号又可能发了一些新微博,定期自动爬取微博就是每隔一段时间自动运行程序,自动爬取这段时间产生的新微博(忽略以前爬过的旧微博)。本部分为可选部分,如果不需要可以忽略。

思路是利用第三方软件,如crontab,让程序每隔一段时间运行一次。因为是要跳过以前爬过的旧微博,只爬新微博。所以需要设置一个动态的since_date。很多时候我们使用的since_date是固定的,比如since_date="2018-01-01",程序就会按照这个设置从最新的微博一直爬到发布时间为2018-01-01的微博(包括这个时间)。因为我们想追加新微博,跳过旧微博。第二次爬取时since_date值就应该是当前时间到上次爬取的时间。 如果我们使用最原始的方式实现追加爬取,应该是这样:

假如程序第一次执行时间是2019-06-06,since_date假如为2018-01-01,那这一次就是爬取从2018-01-01到2019-06-06这段时间用户所发的微博;
第二次爬取,我们想要接着上次的爬,需要手动将since_date值设置为上次程序执行的日期,即2019-06-06

上面的方法太麻烦,因为每次都要手动设置since_date。因此我们需要动态设置since_date,即程序根据实际情况,自动生成since_date。 有两种方法实现动态更新since_date:

方法一:将since_date设置成整数

将config.json文件中的since_date设置成整数,如:

"since_date": 10,

这个配置告诉程序爬取最近10天的微博,更准确说是爬取发布时间从10天前到本程序开始执行时之间的微博。这样since_date就是一个动态的变量,每次程序执行时,它的值就是当前日期减10。配合crontab每9天或10天执行一次,就实现了定期追加爬取。

方法二:将上次执行程序的时间写入文件(推荐)

这个方法很简单,就是用户把要爬的用户id写入txt文件,然后再把文件路径赋值给config.json中的user_id_list参数。

txt文件名格式可以参考程序设置中的设置user_id_list部分,这样设置就全部结束了。

说下这个方法的原理和好处,假如你的txt文件内容为:

1669879400
1223178222 胡歌
1729370543 郭碧婷 2019-01-01

第一次执行时,因为第一行和第二行都没有写时间,程序会按照config.json文件中since_date的值爬取,第三行有时间“2019-01-01”,程序就会把这个时间当作since_date。每个用户爬取结束程序都会自动更新txt文件,每一行第一部分是user_id,第二部分是用户昵称,第三部分是程序准备爬取该用户第一条微博(最新微博)时的日期。爬完三个用户后,txt文件的内容自动更新为:

1669879400 Dear-迪丽热巴 2020-01-18
1223178222 胡歌 2020-01-18
1729370543 郭碧婷 2020-01-18

下次再爬取微博的时候,程序会把每行的时间数据作为since_date。这样的好处一是不用修改since_date,程序自动更新;二是每一个用户都可以单独拥有只属于自己的since_date,每个用户的since_date相互独立,互不干扰,格式为yyyy-mm-dd或整数。比如,现在又添加了一个新用户,以杨紫的微博为例,你想获取她2018-01-23到现在的全部微博,可以这样修改txt文件:

1669879400 迪丽热巴 2020-01-18
1223178222 胡歌 2020-01-18
1729370543 郭碧婷 2020-01-18
1227368500 杨紫 3 梦想,希望

注意每一行的用户配置参数以空格分隔,如果第一个参数全部由数字组成,程序就认为此行为一个用户的配置,否则程序会认为该行只是注释,跳过该行;第二个参数可以为任意格式,建议写用户昵称;第三个如果是日期格式(yyyy-mm-dd),程序就将该日期设置为用户自己的since_date,否则使用config.json中的since_date爬取该用户的微博,第二个参数和第三个参数也可以不填。 也可以设置第四个参数,将被读取为query_list。

方法三:将const.py文件中的运行模式改为append

以追加模式运行程序,每次运行,每个id只获取最新的微博,而不是全部,避免频繁备份微博导致过多的请求次数。

注意:

  • 该模式会跳过置顶微博。
  • 若采集信息后用户又编辑微博,则不会记录编辑内容。

8.使用docker

docker run

docker build -t weibo-crawler .
docker run -it -d \
  -v path/to/config.json:/app/config.json \
  -v path/to/weibo:/app/weibo \
  -e schedule_interval=1 \ # 可选:循环间隔(分钟)
  weibo-crawler

docker compose

version: '3'
services:
  weibo-crawler:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - path/to/config.json:/app/config.json
      - path/to/weibo:/app/weibo
    environment:
      - schedule_interval=1 # 可选:循环间隔(分钟)

如何获取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。

添加cookie与不添加cookie的区别(可选)

对于微博数2000条及以下的微博用户,不添加cookie可以获取其用户信息和大部分微博;对于微博数2000条以上的微博用户,不添加cookie可以获取其用户信息和最近2000条微博中的大部分,添加cookie可以获取其全部微博。以2020年1月2日迪丽热巴的微博为例,此时她共有1085条微博,在不添加cookie的情况下,可以获取到1026条微博,大约占全部微博的94.56%,而在添加cookie后,可以获取全部微博。其他用户类似,大部分都可以在不添加cookie的情况下获取到90%以上的微博,在添加cookie后可以获取全部微博。具体原因是,大部分微博内容都可以在移动版匿名获取,少量微博需要用户登录才可以获取,所以这部分微博在不添加cookie时是无法获取的。

有少部分微博用户,不添加cookie可以获取其微博,无法获取其用户信息。对于这种情况,要想获取其用户信息,是需要cookie的。

如需抓取微博转发,请添加cookie。

如何获取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值,复制即可,如图所示:

如何检测cookie是否有效(可选)

本程序cookie检查的逻辑是:使用cookie来源账号发布限定范围的微博,若cookie可用,则可以读取到该微博,否则读取不到。

操作方法

  1. 使用cookie的来源账号发布一条微博,该账号和微博需要满足以下条件:

    • 该微博必须是非公开可见的,后续需要根据可见性判断cookie是否有效;

    • 该微博需要是最近5条微博,不能在发布测试用微博内容后又发很多新微博;

    • config.json配置中的since_date之后,该账号必须有大于9条微博。

  2. const.py文件中'CHECK': False中的False改为True'HIDDEN_WEIBO': '微博内容'中的微博内容改为你发的限定范围的微博。

  3. 将提供cookie的微博id放置在config.json文件中"user_id_list"设置项数组中的第一个。例如提供cookie的微博id为123456,则"user_id_list"设置为"user_id_list":["123456", "<其余id...>"]

注:本方法也将会抓取提供cookie账号的微博内容。

在间歇运行程序时,cookie无效会导致程序不能按照预设目标执行,因此可以打开cookie通知功能。本项目使用开源项目pushdeer进行通知,在使用前用户需要申请push_key,具体可查看官网了解。打开方法为:

  1. const.py文件中,将'NOTIFY': False中的False设为True
  2. 'PUSH_KEY': ''''替换为'<你的push_key>'

weibo-crawler's People

Contributors

blancray avatar bluehtml avatar brian95827 avatar casouri avatar cuckon avatar dataabc avatar dependabot[bot] avatar echo536 avatar enel1jk avatar gaelthas avatar haozewu avatar hjyssg avatar libai1024 avatar lisicheng1997 avatar lwd-temp avatar mobyw avatar nanamicat avatar noisyle avatar plutonji avatar thepopezhang avatar waizui avatar weydon-ding avatar xyauhideto avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

weibo-crawler's Issues

关于微博原文内的链接内容

微博会将链接转成短链接。 显示的时候就是一个 “网页链接” 的超链
爬取下来时,就变成纯文字 网页链接 四个字。链接t.cn/xxx的内容就丢失了。
下载:O网页链接 码:6n4h

好像记得早前的版本能爬出t.cn的内容

[新功能提议] 关于输出、避免限制、下载、断点续写

尝试了一下这个repository做一些个人需求的爬虫,根据自己的实践经验提一些建议。

关于输出

如果需要阅读输出的内容,目前的输出格式不是很友好,反而是标准输出非常易读,而且没有url信息干扰。
改动不多:

  • 可以考虑将标准输出改为文件输出,易读且不影响其他进度条的监视,因为输出容易淹没进度条信息。
  • 可以考虑额外再输出原博地址、原博内链接;因为想阅读很久远的微博可能很难手动获取,附上地址会有帮助;原博内偶尔有图片链接、视频链接等,但不在html格式里展示,同时被xpath删除,这个也比较简单,//a/@href可以获取,但是确实会有信息重复等缺陷。
  • 为了易读性,应该保留换行信息;也比较简单,仅仅将<br />替换成\\n就可以输出换行并且不打扰其他格式。

关于避免限制

  • 供其他使用者参考:根据我的经验,我感觉1-5页sleep一次略少,我比较怂就每一页都会sleep一次,但是正常情况下适当增加sleep概率也应该有帮助。我甚至在此之外每20页再sleep一次。但持续时间有点太长了,需要经常更新cookies。
  • 被杀不易发现,但有时看似正常但无法访问长微博。
  • 为了帮助监视爬虫情况,我认为也应该定期输出抓取的微博条数,可以跟页数一起显示;同时根据目前情况,不计入置顶一页理论上应该有10条,可以考虑输出非10条的页供判断。当然确实有很多页不足10条,因此这个输出应仅供参考。
  • 下载图片不易被限制,但视频容易被限制,约半小时(?)后才能解禁,关于视频参见下一条。

关于下载

  • 下载图片基本没有被限制的情况。
  • 下载视频过分容易被限制,可能也是因为集中下载视频的行为,而且并不报错而是变成1KB的文件,因此可以考虑通过同时监视视频下载个数、时间、下载量,定期sleep。我仅仅改成每3条sleep一次就已经有所改善,但是依然容易被杀,这导致非常需要断点续写功能,关于断点续写参见下一条。

关于断点续写

考虑到被限流后,微博页(get_one_page)、长微博、视频的获取都有可能成为困难,因此断点续写功能还是很重要的。有一些个人思路供参考:

  • 一个可能较大的改动:希望能隔一段时间dump一次文件,不止是微博内容,还有下载,因为实际上下载也很占据时间……同时输出汇总信息,供参考判断。微博条数多的时候很重要,可以帮助debug(?);而且断点续写也可以根据该功能来实现,选择从某一页开始重新跑即可,不必为了下载而从头开始;此外向微博请求的数据也会更像人类一点,猜测会帮助减少限制的可能性。
  • 建议加入从某页开始的toggle或者是某个时间节点截止的option。因为程序思路是根据页数顺序下载收集,since_date在第一次爬取不成功的情况下不是很有用……挂掉的情况下还是end_date或是restart_page等目前不存在的功能会有帮助一点。

最后应该声明这些都是根据个人经验提出的参考意见。本来只是自己想小作修改为个人所用,但也许对其他人也有帮助还是写一段。由于最开始没打算上传因此代码目前被改得乱七八糟所以就不放我自己写的了……大部分都实现了所以寄希望于owner进行更优雅的改动了……但也许有空我也会考虑重新改一下……不过还是希望得到owner的反馈对以上所述进行取舍……

你好,user id list无法正常读取

你好,我尝试把id都放在新建的txt文档里,但是分别遇到了两次错误

  1. 按照readme里面每行一个id,id后面加空格再加注释(可选)的方式,显示utfcode无法解码(Error: 'utf-8' codec can't decode byte 0xc0 in position 13: invalid start byte)。
  2. 去掉注释和空格以后,每行留一个id,只能爬第一个id,然后显示Error: 'nickname'
    请问可以帮忙解答一下是什么原因吗?
    非常感谢这个项目及解答!

since_date设置后无效

你好,我设置了since_date为“2019-12-01”后爬取时还是能爬到很久以前(2012年)的微博。
image

将id_list的值设置为包含多个txt文件的文件夹

你好,因为我要爬取的量太大了,昨天爬了200多个用户就不行了。所以我想把我的user_id_list设置为一个文件夹,然后文件夹里很多小的txt文件,每个txt包含100个id,然后设置分别对文件夹里的每个txt爬取,每爬完一个txt睡眠长一点时间后再继续爬文件夹里的下一个txt。可不可以问下,如果我想这样实现的话,需要怎么修改代码?

('Error: ', KeyError('status',))

我爬取博主(1711243680),用的 python2.7, 在Ubuntu中操作, 不断出现如下错误:

('Error: ', KeyError('status',))
Traceback (most recent call last):
  File "weibo.py", line 302, in get_one_page
    wb = self.get_one_weibo(w)
  File "weibo.py", line 280, in get_one_weibo
    retweet = self.get_long_weibo(retweet_id)
  File "weibo.py", line 70, in get_long_weibo
    weibo_info = js['status']
KeyError: 'status'

倒是可以继续爬,但是会漏掉一些推文.换另一个博主也是同样情况, filter = 0或1 都会出现同样情况.不知道是为什么?不知道是不是跟微博包含视频有关?

您好,这个报错应该怎么修改呀?

Error: Expecting property name enclosed in double quotes: line 9 column 1 (char 172)
Traceback (most recent call last):
File "D:/Anaconda3/weibo-crawler-master/weibo.py", line 807, in main
config = json.loads(f.read())
File "D:\Anaconda3\lib\json_init_.py", line 348, in loads
return _default_decoder.decode(s)
File "D:\Anaconda3\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "D:\Anaconda3\lib\json\decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 9 column 1 (char 172)

'Error: ', KeyError('statuses_count',)

('Error: ', KeyError('statuses_count',))
Traceback (most recent call last):
  File "weibo.py", line 479, in start
    self.get_pages()
  File "weibo.py", line 452, in get_pages
    page_count = self.get_page_count()
  File "weibo.py", line 364, in get_page_count
    weibo_count = self.user['statuses_count']
KeyError: 'statuses_count'

这个微博已经炸号(但号主本人也就是我可以正常浏览)请问是否炸号有可能导致了该错误?

KeyError: 'pic_download'该怎么解决?

Error: 'pic_download'
Traceback (most recent call last):
File "G:/PyCharm/spider/1.py", line 1073, in main
wb = Weibo(config)
File "G:/PyCharm/spider/1.py", line 26, in init
self.validate_config(config)
File "G:/PyCharm/spider/1.py", line 68, in validate_config
if config[argument] != 0 and config[argument] != 1:
KeyError: 'pic_download'

用id1669879400试写mysql数据库时报错

你好,报错为:pymysql.err.DataError: (1406, "Data too long for column 'at_users' at row 1")

这里数据库小白一枚..查了一下网上说有可能是数据库的编码问题。我看了一下mysql的编码如下(server的编码也是utf8mb4),不知道具体哪个值的编码应该再进行调整。麻烦你方便的时候帮忙看一下~谢谢!!
屏幕截图(24)

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)请问如何处理?

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: 0%| | 0/156 [00:00<?, ?it/s]第1页
Progress: 0%| | 0/156 [00:00<?, ?it/s]
微博爬取完成,共爬取0条微博
信息抓取完毕


Error: Expecting value: line 1 column 1 (char 0)
Traceback (most recent call last):
File "/Users/cc/Downloads/weibo-crawler-master/weibo.py", line 854, in start
self.get_pages()
File "/Users/cc/Downloads/weibo-crawler-master/weibo.py", line 803, in get_pages
self.get_user_info()
File "/Users/cc/Downloads/weibo-crawler-master/weibo.py", line 174, in get_user_info
js = self.get_json(params)
File "/Users/cc/Downloads/weibo-crawler-master/weibo.py", line 113, in get_json
return r.json()
File "/Users/cc/anaconda3/lib/python3.7/site-packages/requests/models.py", line 897, in json
return complexjson.loads(self.text, **kwargs)
File "/Users/cc/anaconda3/lib/python3.7/json/init.py", line 348, in loads
return _default_decoder.decode(s)
File "/Users/cc/anaconda3/lib/python3.7/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Users/cc/anaconda3/lib/python3.7/json/decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

[userid问题]这次的数字似乎比较大,也出现了同样的问题

大概由于微博是比较新注册的? userid比较长, 结果也出现了类似英文个性化域名输入时的错误

Error: 'statuses_count'
Traceback (most recent call last):
File "weibo.py", line 739, in start
self.get_pages()
File "weibo.py", line 694, in get_pages
page_count = self.get_page_count()
File "weibo.py", line 475, in get_page_count
weibo_count = self.user['statuses_count']
KeyError: 'statuses_count'

id是1005055911162580,麻烦大神再看一下,谢谢!

no module named requests

File "weibo.py", line 16, in <module> import requests ImportError: No module named requests
requests删了装,不懂上面这是什么情况

您好,请问出现这样的错误显示该怎么解决呢?

Error: list index out of range
Traceback (most recent call last):
File "E:\weiboSpider.py", line 161, in extract_user_info
if selector.xpath("//div[@Class='tip'][2]/text()")[0] == u'学习经历':
IndexError: list index out of range
Error: invalid literal for int() with base 10: ''
Traceback (most recent call last):
File "E:\weiboSpider.py", line 254, in get_user
weibo_num = int(user_info[0][3:-1])
ValueError: invalid literal for int() with base 10: ''

你好,不好意思,再问下...我按照你说的做了以后,输出的文件没有数据,是空的

def get_pages(self):
    """获取全部微博"""
    self.get_user_info()
    
    gender = u'女' if self.user['gender'] == 'f' else u'男'#性别
    import pandas as pd
    df=pd.DataFrame()
    df['ID']=self.user['id']
    df['昵称']=self.user['screen_name']
    df['性别']=gender
    df['微博数']=self.user['statuses_count']
    df['微博粉丝数']=self.user['followers_count']
    df['微博关注数']=self.user['follow_count']
    df['微博简介']=self.user['description']
    df['微博等级']=self.user['urank']
    df['微博会员等级']=self.user['mbrank']
    df.to_excel('%s个人信息.xlsx'%self.user['screen_name'],index=False)
    
    page_count = self.get_page_count()
    wrote_count = 0
    self.print_user_info()

你好,我按照这个输出,但是输出文件是空的,没有数据

怎样设置只爬取用户数据,增加爬取年龄数据

你好,
(1)怎样设置只爬取用户数据,不爬取微博数据?
(2)能否爬取用户数据的所在地(比如北京 海淀)和年龄?如何修改
(3)程序出错,错误原因可能为以下两者:
1.user_id不正确;
2.此用户微博可能需要设置cookie才能爬取。
解决方案:
请参考
https://github.com/dataabc/weibo-crawler#如何获取user_id
获取正确的user_id;
或者参考
https://github.com/dataabc/weibo-crawler#3程序设置
中的“设置cookie”部分设置cookie信息
在出现以上错误的时候,怎样跳过此ID的读取,继续运行?
非常感谢!

在外部调用weibo.py报错:TypeError: encode() argument 1 must be string, not None

我在Node程序中调用weibo.py,代码如下:

//index.js
const spawn = require("child_process").spawn; 
const process = spawn('python',["./weibo.py"])
process.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
});
process.stderr.on('data', (data) => {
    console.error(`stderr: ${data}`);
});

index.js和weibo.py在同一级目录下
执行命令

$ node index.js

报错如下:

stderr: Traceback (most recent call last):

stderr:   File "./weibo.py", line 947, in start
    self.get_pages()
  File "./weibo.py", line 888, in get_pages
    self.get_user_info()
  File "./weibo.py", line 200, in get_user_info
    user = self.standardize_info(user_info)
  File "./weibo.py", line 424, in standardize_info
    sys.stdout.encoding, "ignore").decode(sys.stdout.encoding)
TypeError: encode() argument 1 must be string, not None

stdout: ('Error: ', TypeError('encode() argument 1 must be string, not None',))

报错结果显示weibo.py第424行报错:

weibo[k] = v.replace(u"\u200b", "").encode(
                    sys.stdout.encoding, "ignore").decode(sys.stdout.encoding)

sys.stdout.encoding的值是None,引发了报错,那么能否用固定值替换sys.stdout.encoding

我试了一下把用户id都放在txt文件里爬取 发生以下错误

Error: list index out of range
Traceback (most recent call last):
File "E:/微博数据/爬虫工具/weiboSpider-master/weiboSpider-master/weiboSpider.py", line 161, in extract_user_info
if selector.xpath("//div[@Class='tip'][2]/text()")[0] == u'学习经历':
IndexError: list index out of range
用户昵称:
用户id: user_id_list.txt
微博数: 9
关注数: 244
粉丝数: 263
url:https://weibo.cn/user_id_list.txt


不能按照txt里的内容爬取 不知道哪里出了差错 txt内容就是实验内容 胡歌迪丽热巴那三个明星

安装Python模块失败

环境

  • OS: Windows 10
  • Python3.8.1

重现步骤

$ python -m pip install -r requirements.txt

报错信息

Collecting lxml==4.3.4 (from -r requirements.txt (line 1))
  Using cached https://files.pythonhosted.org/packages/da/b5/d3e0d22649c63e92cb0902847da9ae155c1e801178ab5d272308f35f726e/lxml-4.3.4.tar.gz
Requirement already satisfied: requests==2.22.0 in c:\users\shizhang\appdata\local\programs\python\python38\lib\site-packages (from -r requirements.txt (line 2)) (2.22.0)
Requirement already satisfied: tqdm==4.32.2 in c:\users\shizhang\appdata\local\programs\python\python38\lib\site-packages (from -r requirements.txt (line 3)) (4.32.2)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in c:\users\shizhang\appdata\local\programs\python\python38\lib\site-packages (from requests==2.22.0->-r requirements.txt (line 2)) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in c:\users\shizhang\appdata\local\programs\python\python38\lib\site-packages (from requests==2.22.0->-r requirements.txt (line 2)) (2019.11.28)
Requirement already satisfied: idna<2.9,>=2.5 in c:\users\shizhang\appdata\local\programs\python\python38\lib\site-packages (from requests==2.22.0->-r requirements.txt (line 2)) (2.8)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\users\shizhang\appdata\local\programs\python\python38\lib\site-packages (from requests==2.22.0->-r requirements.txt (line 2)) (1.25.8)
Installing collected packages: lxml
  Running setup.py install for lxml: started
    Running setup.py install for lxml: finished with status 'error'
    ERROR: Command errored out with exit status 1:
     command: 'C:\Users\shizhang\AppData\Local\Programs\Python\Python38\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\shizhang\\AppData\\Local\\Temp\\pip-install-71w5rudd\\lxml\\setup.py'"'"'; __file__='"'"'C:\\Users\\shizhang\\AppData\\Local\\Temp\\pip-install-71w5rudd\\lxml\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\shizhang\AppData\Local\Temp\pip-record-s9zyd_o1\install-record.txt' --single-version-externally-managed --compile
         cwd: C:\Users\shizhang\AppData\Local\Temp\pip-install-71w5rudd\lxml\
    Complete output (77 lines):
    Building lxml version 4.3.4.
    Building without Cython.
    ERROR: b"'xslt-config' is not recognized as an internal or external command,\r\noperable program or batch file.\r\n"
    ** make sure the development packages of libxml2 and libxslt are installed **

    Using build configuration of libxslt
    running install
    running build
    running build_py
    creating build
    creating build\lib.win-amd64-3.8
    creating build\lib.win-amd64-3.8\lxml
    copying src\lxml\builder.py -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\cssselect.py -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\doctestcompare.py -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\ElementInclude.py -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\pyclasslookup.py -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\sax.py -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\usedoctest.py -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\_elementpath.py -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\__init__.py -> build\lib.win-amd64-3.8\lxml
    creating build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\__init__.py -> build\lib.win-amd64-3.8\lxml\includes
    creating build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\builder.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\clean.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\defs.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\diff.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\ElementSoup.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\formfill.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\html5parser.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\soupparser.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\usedoctest.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\_diffcommand.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\_html5builder.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\_setmixin.py -> build\lib.win-amd64-3.8\lxml\html
    copying src\lxml\html\__init__.py -> build\lib.win-amd64-3.8\lxml\html
    creating build\lib.win-amd64-3.8\lxml\isoschematron
    copying src\lxml\isoschematron\__init__.py -> build\lib.win-amd64-3.8\lxml\isoschematron
    copying src\lxml\etree.h -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\etree_api.h -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\lxml.etree.h -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\lxml.etree_api.h -> build\lib.win-amd64-3.8\lxml
    copying src\lxml\includes\c14n.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\config.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\dtdvalid.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\etreepublic.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\htmlparser.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\relaxng.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\schematron.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\tree.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\uri.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\xinclude.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\xmlerror.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\xmlparser.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\xmlschema.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\xpath.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\xslt.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\__init__.pxd -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\etree_defs.h -> build\lib.win-amd64-3.8\lxml\includes
    copying src\lxml\includes\lxml-version.h -> build\lib.win-amd64-3.8\lxml\includes
    creating build\lib.win-amd64-3.8\lxml\isoschematron\resources
    creating build\lib.win-amd64-3.8\lxml\isoschematron\resources\rng
    copying src\lxml\isoschematron\resources\rng\iso-schematron.rng -> build\lib.win-amd64-3.8\lxml\isoschematron\resources\rng
    creating build\lib.win-amd64-3.8\lxml\isoschematron\resources\xsl
    copying src\lxml\isoschematron\resources\xsl\RNG2Schtrn.xsl -> build\lib.win-amd64-3.8\lxml\isoschematron\resources\xsl
    copying src\lxml\isoschematron\resources\xsl\XSD2Schtrn.xsl -> build\lib.win-amd64-3.8\lxml\isoschematron\resources\xsl
    creating build\lib.win-amd64-3.8\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
    copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\iso_abstract_expand.xsl -> build\lib.win-amd64-3.8\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
    copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\iso_dsdl_include.xsl -> build\lib.win-amd64-3.8\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
    copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\iso_schematron_message.xsl -> build\lib.win-amd64-3.8\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
    copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\iso_schematron_skeleton_for_xslt1.xsl -> build\lib.win-amd64-3.8\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
    copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\iso_svrl_for_xslt1.xsl -> build\lib.win-amd64-3.8\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
    copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\readme.txt -> build\lib.win-amd64-3.8\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
    running build_ext
    building 'lxml.etree' extension
    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
    ----------------------------------------
ERROR: Command errored out with exit status 1: 'C:\Users\shizhang\AppData\Local\Programs\Python\Python38\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\shizhang\\AppData\\Local\\Temp\\pip-install-71w5rudd\\lxml\\setup.py'"'"'; __file__='"'"'C:\\Users\\shizhang\\AppData\\Local\\Temp\\pip-install-71w5rudd\\lxml\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\shizhang\AppData\Local\Temp\pip-record-s9zyd_o1\install-record.txt' --single-version-externally-managed --compile Check the logs for full command output.
WARNING: You are using pip version 19.2.3, however version 20.0.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

如何获取多个user_id

您好,如果想一次获取多个用户(非特定用户)的微博信息,是不是可以在哪里设置random?

无法下载微博中的超链接

如果微博内容中含有超链接,则在爬取的微博正文中只能看到“网页链接”四个字,而无法看到该超链接的内容

CSV打开字段是乱码?

4473417006580828,IuNUwrBYo,浠�澶╂����绗��娆′���瀹������涓�涓ü娆℃���ü�����寰�骞歌����板��瀹�锛�杩�涓����澶т��圭���ュ�ワ�璁╂��浠�浠�韬��瀛﹀�板�澶���村�颁�澶╋���杩��戒�浠��i���峰��介���璋㈣阿�ㄤ�涓ü绔���垢绂��板��骞�����灏�浼�浼翠滑锛���浣 浠��璧峰伐浣����跺��寰�蹇���璋㈣阿��娆㈠��瀹���浣 浠����浼�甯︾�ü��瀹����d唤���锛�缁х画��琛��灏�骞哥�灏辫��扮�浜�锛�绁��夸�浠��涓ü绔��芥��垢绂�锛甯���涓�娆★�杩��戒�浣 �搁��#涓�涓ü绔���垢绂�澶х�灞ü#,https://wx2.sinaimg.cn/large/006aZ9kDly1gc0tr5z1tbj30s50gldj5.jpg,,,2020-02-18,,468563,52426,74071,涓�涓ü绔���垢绂�澶х�灞ü,

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.