Home

Awesome

功能

连续获取一个或多个微博关键词搜索结果,并将结果写入文件(可选)、数据库(可选)等。所谓微博关键词搜索即:搜索正文中包含指定关键词的微博,可以指定搜索的时间范围。<br> 举个栗子,比如你可以搜索包含关键词“迪丽热巴”且发布日期在2020-03-01和2020-03-16之间的微博。搜索结果数量巨大,对于非常热门的关键词,在一天的指定时间范围,可以获得1000万以上的搜索结果。注意这里的一天指的是时间筛选范围,具体多长时间将这1000万微博下载到本地还要看获取的速度。1000万只是一天时间范围可获取的微博数量,如果想获取更多微博,可以加大时间范围,比如10天,最多可以获得1000万X10=1亿条搜索结果,当然你也可以再加大时间范围。对于大多数关键词,微博一天产生的相关搜索结果应该低于1000万,因此可以说本程序可以获取指定关键词的全部或近似全部的搜索结果。本程序可以获得几乎全部的微博信息,如微博正文、发布者等,详情见输出部分。支持输出多种文件类型,具体如下:

输出

使用说明

本程序的所有配置都在setting.py文件中完成,该文件位于“weibo-search\weibo\settings.py”。

1.下载脚本

$ git clone https://github.com/dataabc/weibo-search.git

2.安装Scrapy

本程序依赖Scrapy,要想运行程序,需要安装Scrapy。如果系统中没有安装Scrapy,请根据自己的系统安装Scrapy,以Ubuntu为例,可以使用如下命令:

$ pip install scrapy

3.安装依赖

$ pip install -r requirements.txt

4.设置cookie

DEFAULT_REQUEST_HEADERS中的cookie是我们需要填的值,如何获取cookie详见如何获取cookie,获取后将"your cookie"替换成真实的cookie即可。

5.设置搜索关键词

修改setting.py文件夹中的KEYWORD_LIST参数。 如果你想搜索一个关键词,如“迪丽热巴”:

KEYWORD_LIST = ['迪丽热巴']

如果你想分别搜索多个关键词,如想要分别获得“迪丽热巴”和“杨幂”的搜索结果:

KEYWORD_LIST = ['迪丽热巴', '杨幂']

如果你想搜索同时包含多个关键词的微博,如同时包含“迪丽热巴”和“杨幂”微博的搜索结果:

KEYWORD_LIST = ['迪丽热巴 杨幂']

如果你想搜索微博话题,即包含#的内容,如“#迪丽热巴#”:

KEYWORD_LIST = ['#迪丽热巴#']

也可以把关键词写进txt文件里,然后将txt文件路径赋值给KEYWORD_LIST,如:

KEYWORD_LIST = 'keyword_list.txt'

txt文件中每个关键词占一行。

6.设置搜索时间范围

START_DATE代表搜索的起始日期,END_DATE代表搜索的结束日期,值为“yyyy-mm-dd”形式,程序会搜索包含关键词且发布时间在起始日期和结束日期之间的微博(包含边界)。比如我想筛选发布时间在2020-06-01到2020-06-02这两天的微博:

START_DATE = '2020-06-01'
END_DATE = '2020-06-02'

7.设置FURTHER_THRESHOLD(可选)

FURTHER_THRESHOLD是程序是否进一步搜索的阈值。一般情况下,如果在某个搜索条件下,搜索结果很多,则搜索结果应该有50页微博,多于50页不显示。当总页数等于50时,程序认为搜索结果可能没有显示完全,所以会继续细分。比如,若当前是按天搜索的,程序会把当前的1个搜索分成24个搜索,每个搜索条件粒度是小时。这样就能获取在天粒度下无法获取完全的微博。同理,如果小时粒度下总页数仍然是50,会继续细分,以此类推。然而,有一些关键词,搜索结果即便很多,也只显示40多页。所以此时如果FURTHER_THRESHOLD是50,程序会认为只有这么多微博,不再继续细分,导致很多微博没有获取。因此为了获取更多微博,FURTHER_THRESHOLD应该是小于50的数字。但是如果设置的特别小,如1,这样即便结果真的只有几页,程序也会细分,这些没有必要的细分会使程序速度降低。因此,建议FURTHER_THRESHOLD的值设置在40与46之间

FURTHER_THRESHOLD = 46

8.设置结果保存类型(可选)

ITEM_PIPELINES是我们可选的结果保存类型,第一个代表去重,第二个代表写入csv文件,第三个代表写入MySQL数据库,第四个代表写入MongDB数据库,第五个代表下载图片,第六个代表下载视频。后面的数字代表执行的顺序,数字越小优先级越高。如果你只要写入部分类型,可以把不需要的类型用“#”注释掉,以节省资源;如果你想写入数据库,需要在setting.py填写相关数据库的配置。

9.设置等待时间(可选)

DOWNLOAD_DELAY代表访问完一个页面再访问下一个时需要等待的时间,默认为10秒。如我想设置等待15秒左右,可以修改setting.py文件的DOWNLOAD_DELAY参数:

DOWNLOAD_DELAY = 15

10.设置微博类型(可选)

WEIBO_TYPE筛选要搜索的微博类型,0代表搜索全部微博,1代表搜索全部原创微博,2代表热门微博,3代表关注人微博,4代表认证用户微博,5代表媒体微博,6代表观点微博。比如我想要搜索全部原创微博,修改setting.py文件的WEIBO_TYPE参数:

WEIBO_TYPE = 1

11.设置包含内容(可选)

CONTAIN_TYPE筛选结果微博中必需包含的内容,0代表不筛选,获取全部微博,1代表搜索包含图片的微博,2代表包含视频的微博,3代表包含音乐的微博,4代表包含短链接的微博。比如我想筛选包含图片的微博,修改setting.py文件的CONTAIN_TYPE参数:

CONTAIN_TYPE = 1

12.筛选微博发布地区(可选)

REGION筛选微博的发布地区,精确到省或直辖市,值不应包含“省”或“市”等字,如想筛选北京市的微博请用“北京”而不是“北京市”,想要筛选安徽省的微博请用“安徽”而不是“安徽省”,可以写多个地区,具体支持的地名见region.py文件,注意只支持省或直辖市的名字,省下面的市名及直辖市下面的区县名不支持,不筛选请用”全部“。比如我想要筛选发布地在山东省的微博:

REGION = ['山东']

13.配置数据库(可选)

MONGO_URI是MongoDB数据库的配置;<br> MYSQL开头的是MySQL数据库的配置。

14.运行程序

$ scrapy crawl search -s JOBDIR=crawls/search

其实只运行“scrapy crawl search”也可以,只是上述方式在结束时可以保存进度,下次运行时会在程序上次的地方继续获取。注意,如果想要保存进度,请使用“Ctrl + C”一次,注意是一次。按下“Ctrl + C”一次后,程序会继续运行一会,主要用来保存获取的数据、保存进度等操作,请耐心等待。下次再运行时,只要再运行上面的指令就可以恢复上次的进度。如果再次运行没有结果,可能是进度没有正确保存,可以先删除crawls文件夹内的进度文件,再运行上述命令。

如何获取cookie

  1. 用Chrome打开 https://weibo.com/
  2. 点击"立即登录", 完成私信验证或手机验证码验证, 进入新版微博. 如下图所示: <img src="https://user-images.githubusercontent.com/41314224/144813569-cfb5ad32-22f0-4841-afa9-83184b2ccf6f.png" width="400px" alt="...">
  3. 按F12打开开发者工具, 在开发者工具的 Network->Name->weibo.cn->Headers->Request Headers, 找到"Cookie:"后的值, 这就是我们要找的cookie值, 复制即可, 如图所示: <img src="https://picture.cognize.me/cognize/github/weibospider/cookie3.png" width="400px" alt="...">

兼容性说明: 获取旧版微博的Cookie

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