任何事件在微博的发酵速度绝对是各大平台中最快的,如果把微博评论爬取下来,进行处理和分析,就能对某个事件的不同立场和风向有了全面的了解和掌握。
当然,评论量大的微博在爬取时耗费时间较长,为了缩短操作时间,找了老罗的一条评论不太多的微博进行演示。
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 均按默认即可
微博这一类的主流网站现在都普遍采用ajax加载数据,也就是如果你通过传统的爬虫方式post一个url或者请求参数过去,接受响应的字符串,也就是响应的html代码,会发现里面没有你要的数据,这是因为这个代码里面有一些js脚本,等到浏览器显示这个网页的时候,这些js就会运行,从而显示你想要看的数据,ajax还用来在你操作的时候不刷新网页,只加载一部分页面数据,如果你发现一个网站在你操作的时候只有页面部分数据在变动,网址不变,就是ajax,这个很容易判断。另外,如果你发现网页浏览器显示网页加载完毕,然后页面上还有一些数据正在加载,这种数据也属于ajax异步加载的。判断好之后,就要采用能处理ajax的方式抓取数据了。
这里有两种方法: 1. 分析ajax脚本,找到对应的加载数据的js脚本,然后分析其逻辑,一般也是生成一个http请求,然后这个http请求一般只返回jason格式的数据。你可以通过代码模拟这个请求来获取数据。但是这种办法比较老土,也很麻烦需要你研究js代码的逻辑,你如果不会写代码就比较麻烦。当然有一些fiddler之类的网页通信抓包分析工具可以帮你一些忙。
2. 使用现在比较主流的智能采集软件如八爪鱼,需要支持浏览器和可视化采集,这样软件会自动模拟人的操作完成所有工作,包括运行界面的脚本,最后你会在界面上看到数据,就和上网看网页没任何区别,但是此类工具可以自动提取你在网页上看到的数据。用鼠标点点就提取到数据了,这种方式适合不懂代码的人。
3. 当然你也可以上网上找一下别人都是怎么采集微博数据的。然后拿别人的劳动成果来用,这个就更简单。比如,我按照你的要求在数多多上搜索微博数据采集规则就出来好多。截图如下:可以看到有微博账号,话题,评论,明星等等,别人也都详细写了如何用这些东西。
在面向对象的高级语言中,早已有人将http请求封装成了类库,你只需要调下接口,就能获得目标网页的源码。所以程序需要做的就是请求目标url,获取页面的源码,解析html。基本流程是:获取目标页面源码,方法:调用对应的类库。
解析html文件,提取出自己想要的信息。方法:正则表达式或者解析html的库。
按照上述步骤,C++(Qt)涉及的类是:
WebView,它的内核其实就是webkit,所以它就是一个功能原始的浏览器,他内置能够返回页面源码的函数,接受一个url的string类型参数,返回一个QString对象。
WebView类有方法能够处理DOM。
C#(.net)涉及的类是:
WebClient,WebRequest,HttpWebRequest等类,第一个封装得比较高级,写法简单,后面两个封装得低级,写起来麻烦但是用起来灵活,HttpWebRequest是WebRequest的一个子类。
Html Agility Pack。
Python涉及的包是:
urllib,urllib2,前者仅可以接受URL,不能伪装Header,但是需要用它的一个函数对post数据进行编码。类似于浏览器的有Selenium。
BeautifulSoup。
上面三种相比,python写法最简单,操作也灵活,要获取源码只要写一句话就行。字符串处理python也毫不逊色于C#和C++。