杜晓旭 贾小云
摘 要: 在大数据时代下,新浪微博的出现为人们获取和参与信息数据及其传播提供了全新的途径。而面对新浪微博不断增加的信息数据,人们对于提高微博获取的精确性和时效性也提出了更高的要求。在这一背景下,本文将重点围绕基于Python的新浪微博爬虫进行简要分析研究,在对Python与网络爬虫的基本概念进行明确的基础上,尝试设计一种Python的新浪微博爬虫程序,为相关研究人员提供相应理论参考。
关键词: Python;新浪微博;网络爬虫;程序设计
中图分类号: TP311.1 文献标识码: A DOI:10.3969/j.issn.1003-6970.2019.04.039
本文著录格式:杜晓旭,贾小云. 基于Python的新浪微博爬虫分析[J]. 软件,2019,40(4):182185
【Abstract】: During big data era, emergence of Sina Weibo provides new way for people to access and participate in information data and its dissemination. With increasing information and data of Sina Weibo, people put forward higher requirements for improving accuracy and timeliness of microblog acquisition. Under the backgroud, the paper analyzes and researches Python-based Sina Weibo crawler briefly, defines basic concepts of Python and Internet crawler, and attempts to design a Python Weibo crawler program, to provide related theoretical reference for researchers.
【Key words】: Python; Sina Weibo; Web crawler; Programming
0 引言
虽然目前以新浪微博为代表的众多社会媒体均为研发人员提供了部分数据访问编程接口,使其能够准确获取相关信息数据。但实际在使用此类数据访问编程接口时经常容易受到诸多限制,如抓取频率等且难以精准搜索微博内容等。而本文通过探究基于Python的新浪微博爬虫设计,可以有效为精准获取微博数据提供全新的方法路径。对提高程序开发人员的工作效率和数据分析成效均具有积极的帮助作用。
1 网络爬虫与Python的基本概念
1.1 网络爬虫
网络爬虫指的就是一种根据既定规则对Web网页中应用程序或脚本进行自动提取的技术。在当前的搜索引擎中对数据系统进行抓取时,网络爬虫作为其中至关重要的组成部分之一,负责帮助搜索引擎快速从互联网上完成所需Web页面的下载操作,从而将互联网中的Web网页下载至本地用以有效备份。爬虫在从某一个或多个初始页面URL中对页面源文件進行分析,准确抓取新Web链接,并以此为基础寻找新Web链接直至完成全部页面的准确抓取和分析[1-2]。
1.2 Python
Python从本质上来说属于一种开源编程语言,其具有功能强大、语法简便、适用性良好等优势特性。Python语言具有较高的效率且完全面向对象,可以快速完成面向对象编程,加之其语法简洁并支持动态输入,因此目前在许多操作系统平台中均选择使用Python语言作为脚本语言,用于在短时间内开发相应应用程序。Python语言提供了针对网络协议标准库,抽象封装网络协议中的每一个层次,使得程序员能够节省大量的时间与精力进行程序逻辑处理。另外Python语言在对多种模式的字节流处理方面也具有一定的优势性,开发速度较快,因而也使其被广泛运用在各种编程、应用程序开发中。
2 Python下的新浪微博爬虫程序设计
2.1 设计构想
在对新浪微博进行爬取的过程中,可以选择使用纯爬虫或是运用新浪提供的部分数据访问编程接口即Open API接口。值得注意的是,虽然新浪微博提供的数据访问编程接口本身便是为开发者程序开发所设计,但其存在诸多限制。例如只有得到新浪授权的开发者才能使用这一接口,一旦授权过期开发者便无法继续使用该接口,此外Open API接口在访问频次等方面同样存在一定的局限性。因此综合考虑,在设计基于Python的新浪微博爬虫程序时,本文选择使用纯爬虫的方式,重点爬取移动端的新浪微博内容。
2.2 程序模块
本文所设计的基于Python新浪微博爬虫程序采用模块化的设计理念,该程序总共分为三大模块。首先需要在完成新浪微博注册的基础上,根据注册中使用的账户名与密码登录进入移动端的新浪微博,对其网站源码进行准确分析,获取这一新浪微博账户的Cookie[3-4]。此后需要通过借助Request URL获取登录页面html代码,并使用Python语言中自带的lxml库对该代码进行相应分析,从而准确爬取新浪微博用户的user_ID。随后根据关键字对与其条件相符的微博进行自动筛选,筛选出的微博则需要统一保存至本地。最后对爬取的数据展开数据分析实验,验证该爬虫程序的有效性即可。
2.3 程序设计
2.3.1 获取账号Cookie
在该基于Python新浪微博爬虫程序中,第一步需要获取新浪微博账户的Cookie并获取对应的登录页面代码。在程序设计中Cookie专门指的是一小段文本信息,服务器在接收到新浪微博用户客户端发送的请求之后,将会对这一新浪微博用户客户端的实际状态进行准确记录,并按照既定规则对微博账号进行加密处理。随后将加密后的微博账号及时存储在Cookie当中。此时客户端浏览器将会从res?ponse处获得其颁发的一个Cookie,该Cookie在及时被客户端浏览器存储后,新浪网站在接收得到浏览器发送的请求时,浏览器将会连同Cookie与发送的请求网址一并提交至服务器。由服务器负责对Cookie进行检查,从而对客户端的实际状态进行准确辨别。具体来说,首先需要使用chrome浏览器将新浪微博移动端打开,同时将开发者工具调出。随后打开浏览器并选中其中的Preserve log选项,依次将账号与密码键入其中,即可顺利登陆移动版新浪微博客户端。此时需要找到m.weibo.cnHeaders Cookie以及headers,统一资源定位符URL主要是通过一种一种相对比较简便的方式,对可从互联网中直接获取的资源位置以及资源访问方法进行有效表示,简单来说URL即为互联网中的网页地址。在互联网上任意一个文件有且只有一个URL与之相对应,URL主要通过按照既定顺序排列各种数字与字母从而有效确定某一地址,根据URL中包含的具体信息,瀏览器将会选择相应的处理方式。例如当爬取的URL为‘http://weibo.cn/user_id时,与之相对应的爬取用户即为user_id=“renminwang”[5-6]。
2.3.2 网页分析
Python语言中带有若干HTTP客户端库,其中不仅包含Python语言自带的Urllib与Urllib2库之外,还带有requests这一第三方库。requests库具有功能强大、操作简便等优势特点,可为URL操作提供众多所需函数。在使用requests库的过程中,开发者可以如同对本地文件进行直接读取一般对互联网中的数据、ftp中的数据进行直接读取。通过运用requests库,开发者能够在短时间内迅速抓取URL内容,即通过向指定页面发送一个GET请求。由于requests库本身带有解析Json格式的功能,最后将无需进行格式转换的Json格式的数据返回即可。值得注意的是,此时所返回的数据为页面二进制数据,在requests库完成新浪微博页面源代码的有效获取后,将直接利用Python语言中自带的lxml库,利用该库中的etree.HTML对网页源代码进行相应处理,由此自动生成一个可使用lxml库中自带的xpath方法完成解析处理的对象[7]。其中,xpath方法在对被选择对象进行处理时,采用的方法类似目录树,在HTML文档的路径中直接对源代码结构进行准确描述,并使用“/”将上层级路径和下层级路径相互分隔。对某一HTML标签进行定位后便可以对相类似文件中的相对路径进行有效运用。例如存储在HTML标签元素组class当中的微博文本wbContent中,class的属性是“ctt”。但同样存储在该元素组中的微博发布时间WbDate中,class的属性则是“ct”。而存储在HTML标签元素组name当中的微博总页数pageNum中,class的属性是“mp”,在其多维字典当中value为键,其值便是微博总页数即pageNum。对微博文本与微博发布时间进行获取的函数getWB(),依次会将含有微博发布时间的列表list以及含有微博文本的列表list进行返回。由于在获取用户发表微博中,使用浏览器对用户所发表的微博内容进行浏览时,页面并不会一次性显示出所有微博,而是需要用户滚动至页面底部之后,页面才会自动加载出其他微博信息,如此滚动加载操作至少两次才能在一页中显示出所有微博内容。故而此时获取的网页源代码也缺乏一定的完整性,需要配合使用手动滚动的方式或是使用发送HTTP请求的GET方式,建立相应的URL对滚动加载过程进行有效模拟,以便保障获取的网页源代码具有良好的完整性[8]。
2.3.3 匹配关键词
根据最新的数据显示,截至2018年上半年,微博月活跃用户数已经达到了4.3亿人次,且这一数值仍在不断增长。可见越来越多的网民开始选择使用微博获取信息并进行信息的分享与交互。微博文本内容也成为一大海量信息源,但任何一个用户的微博中必定存在意义较小甚至无意义的内容,但只简单使用纯爬虫其无法对微博内容有用与否进行有效区分。因此在简单使用纯爬虫的过程中,其往往会将所有微博全部存储至本地磁盘中,从而导致大量无意义微博内容占据过多存储空间,并大大降低从微博数据中准确筛选所需微博内容的效率。因此本文在设计基于Python的新浪微博爬虫程序时,选择在爬虫中增设带有关键字匹配模块,使得爬虫在读取微博内容时可以直接利用关键字,如果微博文本与关键字相匹配,满足关键字条件则爬虫会将其归至有用微博范畴中并直接将其下载、存储到本地文件中[9]。在关键词提取中,首先需要将微博预处理文档打开并对其中一行字符串进行有效读取,赋给变量text,此时字符串即文档数量表示为text_ num。在text不为空的情况下,对其进行拆分,此时将该文档记录成text_name,并为其创建相应的列表,命名为text_list1。对拆分后的词语进行存储后将该文档总词数记录为text_name_num。随后对其他字符串进行读取,此时对于拆分的词语word需要对text_name文档中是否存在word词语进行准确判断。如果存在则需要对word在其他文档里出现与否进行判断,如果不存在则可以直接将该词添加至字典word_all中,同时赋键值为一。否则需要将该关键字键值加一。但假如字典word_all中不存在与text_name变量相对应的文档名的元素,需要重新建立一个新文件名,作为text_name变量指向的文档名,并赋键值为一空字典word_all2。在该空字典中重新建立一个列表,对当前关键字及其数量、文档词数总量进行准确记录。重复上述步骤直至在word_all中出现了含有各关键字的文档总篇数,求出TF-IDF值即可确定关键字[10]。
2.4 数据分析
本文以利用基于Python的新浪微博爬虫程序对关于“十九大”的微博数据进行抓取,通过对相关微博及微博发布时间进行分析。可知央视新闻在2017年10月1日到10月25日期间,在新浪微博央视新闻客户端中总共发布了300余条微博,在搜索栏中键入“十九大”这一关键字并进行匹配分析后,可知在新浪微博央视新闻客户端中共有266条与该关键字相匹配的微博。而在整个2017年新浪微博用户对十九大的关注度均相对较高,这也意味着当年十九大是人们较为关注的一大热点话题。随着2017年10月24日十九大正式闭幕以后,人们对于十九大的关注热度也在不断降低。但在我国持续贯彻落实十九大精神,要求各行各业以及党员干部抓紧学习十九大精神,严格按照十九大要求开展各项工作的过程中,人们对十九大依舊保持一定关注度,但并未达到十九大召开期间的关注度高峰。
3 结论
通过本文的分析研究,可知Python语言具有语法简便、功能强大等优势特征,运用在新浪微博爬虫程序设计中具有较高的可行性。通过采用纯爬虫的方式搭配使用Python语言,使得用户只需利用新浪微博账号,便可运用爬虫对相关微博数据与信息内容进行准确抓取。同时在设计过程中增加关键词匹配模块,可以令爬虫更加精准搜索与关键词相匹配的微博内容并直接下载保存至本地文件中,便于程序开发者及其他用户对微博的深入挖掘。因此本文所设计的Python下的新浪微博爬虫程序具有较高的实用性和有效性。
参考文献
[1] 王金峰, 彭禹, 王明, 等. 基于网络爬虫的新浪微博数据抓取技术[J]. 中小企业管理与科技(上旬刊), 2019(01): 162-163.
[2] 王英杰. 基于Python的微博数据爬虫程序设计研究[J]. 信息与电脑(理论版), 2018(23): 93-94.
[3] 杜翔, 蔡燕, 兰小机. 基于Python的新浪微博位置数据获取方法研究[J]. 江西理工大学学报, 2018, 39(05): 90-96.
[4] 陈政伊, 袁云静, 贺月锦, 等. 基于Python的微博爬虫系统研究[J]. 大众科技, 2017, 19(08): 8-11.
[5] 王芳, 肖皇培. 以爬虫为兴趣牵引的Python教学方案探索与实践[J]. 软件, 2018, 39(12): 28-31.
[6] 张小璞, 左小清. 在ArcGIS下基于Python的路网数据批处理方法[J]. 软件, 2018, 39(07): 130-133.
[7] 刘清. 网络爬虫针对“反爬”网站的爬取策略分析[J]. 信息与电脑(理论版), 2019(03): 23-24.
[8] Justyna Rybak, Wioletta Rogula-Koz?owska, Izabela Jure-czko, Rados?aw Rutkowski. Monitoring of indoor polycyclic aromatic hydrocarbons using spider webs[J]. Chemosphere, 2019, 218.
[9] 苏国新, 苏聿. 基于Python的可配置网络爬虫[J]. 宁德师范学院学报(自然科学版), 2018, 30(04): 364-368.
[10] 邵晓文. 多线程并发网络爬虫的设计与实现[J]. 现代计算机(专业版), 2019(01): 97-100.