Web Scraper教程(五)爬虫进阶之微博评论的点击「查看更多」爬取

Python018

Web Scraper教程(五)爬虫进阶之微博评论的点击「查看更多」爬取,第1张

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

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

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++。