微博爬虫系列之关键词及指定用户博文爬取

Python014

微博爬虫系列之关键词及指定用户博文爬取,第1张

近期的一些微博爬虫内容,本篇主要将怎么根据关键词或指定用户进行博文爬取。

准备写的内容:

定向词及指定用户博文爬取方面,用的是微博网页版( https://weibo.cn )。对于微博网页版中相关博文的爬取,需要使用到 cookies 。这方面的爬取参考了github上的资源:

写的时候发现网页版的关键词检索接口已经不见了···可能是微博删除了网页版的接口吧···之后再看看怎么在pc端爬取。

这里先介绍怎么指定用户进行博文爬取吧···

指定用户的时候,需要有用户的用户id。通常用户id是一串数字,也有一些账号更改后是字符串,举个例子,何同学跟央视新闻的微博:

在这里何同学的 uid = 6529876887 ,央视新闻的 uid = cctvxinwen 。当然也可以获取到央视新闻以数字存储的id,之后再讲怎么获取,这里直接放出来就是 uid = 2656274875 ,点击可以发现确实是央视新闻的微博 https://weibo.cn/2656274875

这个问题在爬取用户博文方面没有影响,不过在爬取用户信息时会有影响,后面写用户信息爬取再说这个情况怎么解决。

下面以央视新闻为例看看怎么爬用户的博文。

点击进入 央视新闻 的微博,可以看到这个账号发布了很多很多微博,在网页版观看就会显示很多页,那么要爬取的时候就要先获取他的页数。

当点击第二页时,会发现 url 会变成 https://weibo.cn/cctvxinwen?page=2 。也就是说这个翻页是以 page 这个字段进行翻页的,这就好办很多了。

将 page 改成 1 可以发现网页跳转到所有博文的第1页,接下来那我们就先获取到所有的页面url。

首先进入 https://weibo.cn/cctvxinwen?page=1 ,打开开发者模式,在文件中找到自己的 cookies 。

在网页开发者模式下,点开文件可以发现没有json格式的数据输出。因此这里不能直接通过解析json数据获取到页面数据。

这里就需要查看网页返回的文本信息了。这里再定位具体信息时,我用的是 lxml 库里的 etree 方法。

这里要查看具体要定位到哪里,可以在网页上的源码进行定位,比如我们要定位到页数,找到页数所在的地方:

拿到用户的所有博文网页后,就可以进行博文的爬取了。这里每一页的数据是一样的,所以直接用第一页为例就可以了。同样的将页面数据爬下来:

还是在网页上看,定位到某一条博文,可以看到源码是这样子的:

可以看到第1页这里展示了11条博文(这个不一定),每条博文放在 div class="c" id="" 的控件里,这里的id是对应的博文id,于是我们就可以拿到博文的控件:

选择其中一个博文来看

这里我们可以看到要的信息全在这里了,接着就按着控件抓信息。这里拿其中一个节点为例。

首先获取微博的url以及微博id,这个从上面看到,可以从点赞、转发、评论处的链接获取,这里选择最简单的转发链接,对应的点赞数、转发数、评论数也可以顺便爬下来了:

接下来看下微博的创建时间,这里我们看到还有微博的来源,有一些可能会没有这个信息:

接下来就是博文的主体了:

博文方面的内容提取基本就是从github上搬过来的,对内容部分字符串进行了一些匹配清洗:

上面是比较简单的博文情况,有一些可能有图片、视频、转发等情况,这里直接放GitHub的做法,具体爬取方式是一样的,定位控件,找信息:

到这里,指定用户的博文爬取就结束了,主要还是参考了GitHub的大神~

微博这一类的主流网站现在都普遍采用ajax加载数据,也就是如果你通过传统的爬虫方式post一个url或者请求参数过去,接受响应的字符串,也就是响应的html代码,会发现里面没有你要的数据,这是因为这个代码里面有一些js脚本,等到浏览器显示这个网页的时候,这些js就会运行,从而显示你想要看的数据,ajax还用来在你操作的时候不刷新网页,只加载一部分页面数据,如果你发现一个网站在你操作的时候只有页面部分数据在变动,网址不变,就是ajax,这个很容易判断。另外,如果你发现网页浏览器显示网页加载完毕,然后页面上还有一些数据正在加载,这种数据也属于ajax异步加载的。判断好之后,就要采用能处理ajax的方式抓取数据了。

这里有两种方法: 1. 分析ajax脚本,找到对应的加载数据的js脚本,然后分析其逻辑,一般也是生成一个http请求,然后这个http请求一般只返回jason格式的数据。你可以通过代码模拟这个请求来获取数据。但是这种办法比较老土,也很麻烦需要你研究js代码的逻辑,你如果不会写代码就比较麻烦。当然有一些fiddler之类的网页通信抓包分析工具可以帮你一些忙。

2. 使用现在比较主流的智能采集软件如八爪鱼,需要支持浏览器和可视化采集,这样软件会自动模拟人的操作完成所有工作,包括运行界面的脚本,最后你会在界面上看到数据,就和上网看网页没任何区别,但是此类工具可以自动提取你在网页上看到的数据。用鼠标点点就提取到数据了,这种方式适合不懂代码的人。

3. 当然你也可以上网上找一下别人都是怎么采集微博数据的。然后拿别人的劳动成果来用,这个就更简单。比如,我按照你的要求在数多多上搜索微博数据采集规则就出来好多。截图如下:可以看到有微博账号,话题,评论,明星等等,别人也都详细写了如何用这些东西。

任何事件在微博的发酵速度绝对是各大平台中最快的,如果把微博评论爬取下来,进行处理和分析,就能对某个事件的不同立场和风向有了全面的了解和掌握。

当然,评论量大的微博在爬取时耗费时间较长,为了缩短操作时间,找了老罗的一条评论不太多的微博进行演示。

Sitemap name : weibo

Start URL : https://weibo.com/1640571365/J0xeHw48Y?from=page_1035051640571365_profile&wvr=6&mod=weibotime&type=comment

有些页面变化比较细微,需要仔细观察才能发现,微博评论就是这样。

在拖动滚动条至出现「查看更多」的过程中,页面出现了轻微的卡顿,这表示页面有一部分会随着用户往下浏览而加载。

在爬取数据时,如果没有建立「滚动至底部」的选择器,让卡顿的页面也完全呈现出来,则会造成程序找不到「查看更多」的情况,导致大量的数据没有被爬取。

建立「滚动至底部」选择器

Id : scroll

Type : Element scroll down

Select : 点击第1条和第2条评论最外围的方形元素

点击 Done selecting!

勾选 Multiple

点击 Save seletor 完成创建

建立点击「查看更多」选择器

Id : more

Type : Element click

点击 Selector 的 Select : 点击第1条和第2条评论最外围的方形元素

点击 Done selecting!

点击 Click selector 的 Select : 点击「查看更多」,注意点击后对话框中的内容是「a.WB_cardmore」

点击 Done selecting!

Click type : Click more,表示需要不断点击「查看更多」

Click element uniqueness : unique CSS Selector

勾选 Multiple

点击 Save seletor 完成创建

点击刚刚创建的 more 选择器,在此选择器下创建爬取评论的选择器

Id : comment

Type : Text

Select : 点击黄色方形元素中的评论

点击 Done selecting!

点击 Save seletor 完成创建

Request interval 和 Page load delay 均按默认即可