APP下载

基于Scrapy框架的微博用户信息采集系统设计与实现

2024-01-27朱烨行

现代信息科技 2023年24期
关键词:网络爬虫微博

朱烨行 等

赵宝莹  张明杰  魏笑笑  卫昆

摘  要:为深入了解新浪微博用户的有关情况,从中找出最有影响力的微博用户,发现当前新浪微博中的意见领袖,需要知道每位微博用户迄今为止已发表的微博数、关注数和粉丝数等信息。为此使用Python语言设计实现了一个基于Scrapy框架的网络爬虫,该爬虫根据输入的微博用户标识号ID抓取该用户目前已发表的微博数、关注数和粉丝数等信息。由于要连续多次访问微博网站,为了不让微博网站拒绝访问,在设计的爬虫中使用了用户代理和IP代理,其中IP代理选用隧道代理这一动态类型。实验结果表明下载七千多位微博用户的信息用时6小时22分钟。

关键词:Scrapy;网络爬虫;微博;用户代理;IP代理

中图分类号:TP311.1    文献标识码:A  文章编号:2096-4706(2023)24-0041-05

Design and Implementation of Weibo User Information Collection System

Based on Scrapy Framework

ZHU Yehang1, ZHAO Baoying2, ZHANG Mingjie3, WEI Xiaoxiao1, WEI Kun3

(1.School of Modern Post, Xi'an University of Posts and Telecommunications, Xi'an  710121, China;

2.Information Technology Center, Luoyang Institute of Science and Technology, Luoyang  471023, China;

3.College of Economics and Management, Xi'an University of Posts and Telecommunications, Xi'an  710121, China)

Abstract: To gain a deeper understanding of Sina Weibo users' information, from which to identify the most influential Weibo users, discover opinion leaders on current Sina Weibo, it is necessary to know the number of Weibo posts, followers and fans of every Weibo user so far. To this end, a Web crawler based on the Scrapy framework is designed and implemented in Python language. The crawler captures the number of Weibo posts, followers, fans published by the user according to the Weibo user ID entered. We have to visit Weibo website for many times in succession, to prevent Weibo website from denying access, the User Agent and IP Proxy are used in the designed crawler. Among them, the IP proxy selects the dynamic type of tunnel proxy. The experimental results show that it takes 6 hours and 22 minutes to download the information of more than 7 000 Weibo users.

Keywords: Scrapy; Web crawler; Weibo; User Agent; IP Proxy

0  引  言

新浪微博又名“微博”,于2009年上线,是一个中国的社交媒体平台,截至2023年5月,其月活跃用户为5.86亿,日活跃用户为2.52亿[1]。可通过个人计算机、手机等设备接入该平台,通过文字、图片、视频等方式,实现信息互动传播、即时分享。

本文所说的微博用户信息指的是微博用户当前已发表的微博数、关注数和粉丝数,这些数据对刻画微博用户很有帮助,可用于确定微博用户影响力、找出意见领袖等方面[2]。

1  相关技术及原理

1.1  网络爬虫

网络爬虫是按规则自动抓取Web网上数据的程序。主要由控制器、解析器、资源库等组成。控制器申请一个线程调用爬虫获取网页内容。解析器下载网页,过滤并分析其中的数据。资源库存储下载的数据[3]。

首先给出一组统一资源定位符(URL)值作为种子,网络爬虫依次访问其中的每一个URL值,下載相应网页,找到在这些网页中的URL链接地址并据此下载新的网页,在新的网页中找新的URL链接地址并下载对应的网页,这样循环下去,直到相关网页抓完为止[4]。

1.2  网络爬虫框架Scrapy

框架就是半成品,集成很多功能、具有较强通用性的项目模板。Scrapy是用Python写的一个Web抓取框架,其中的引擎、调度器不需要用户编写,而其中的Spiders、Item Pipeline需要用户编写。Scrapy是为网页抓取而设计,也可用于通用的网络爬虫[3]。

2  系统设计

2.1  具体实现流程

2.1.1  安装Scrapy

在操作系统Windows 7下安装Scrapy的方法是先安装好Python,在命令行模式下使用pip命令即可安装:pip install scrapy[4]。

2.1.2  创建Scrapy工程

在命令行模式下进入现有的任一目录,如“>cd G:\gzhuyehang\scrapyProject”,运行命令“>scrapy startproject zSinaUser”。即可创建Scrapy工程zSinaUser,并在当前已存在目录下新生成目录zSinaUser,在它下面生成配置文件scrapy.cfg和另外一个名称同为zSinaUser的目录,在第二个zSinaUser目录下生成一个目录spiders和四个文件items.py、middlewares.py、pipelines.py、settings.py[5]。

2.1.3  创建一个爬虫文件

在命令行模式下进入目录“>cd G:\gzhuyehang\scrapyProject\zSinaUser”,运行如下命令:

>scrapy genspider userInfoSpider weibo.cn。使用scrapy genspider命令在目录spiders下创建一个名字为userInfoSpider.py的文件,這个文件搜索的域为weibo.cn,之所以选weibo.cn而不选weibo.com,是因为weibo.cn中页面较简单而且反爬虫措施较弱[5]。

2.2  有关文件分析

本文设计实现的Scrapy框架爬虫最终文件目录结构如图1所示。下面对其中各有关文件进行分析。

2.2.1  文件userInfoSpider.py

该文件用于从输入文件中读取用户标识号ID,并向微博网站发起请求,从网站返回内容中提取相应用户已发表的微博数、关注数和粉丝数,并把这些数据返回给Scrapy引擎[6]。

该文件包含一个类class UserinfospiderSpider(scrapy.Spider),其中包含有两个函数:start_requests和parse_user,分别介绍如下:

1)函数start_requests(self)。该函数从输入文件z0420userid.txt中每次读入一行内容,这行内容是一个微博用户的标识号ID,用该ID号形成该用户的微博主页地址,调用函数Request访问该网页。如此反复直到读完该文件中所有行的内容为止[7]。

2)函数parse_user(self, response)。其中的参数response是读取某一位微博用户主页的返回内容,从中提取出该微博用户标识号ID、微博数、关注数、粉丝数共四个属性数据,组成item项并返回给Scrapy引擎[7]。

2.2.2  文件customUserAgent.py

这是用户代理随机挑选文件,在zmiddlewares目录下,用于从文件resource.py中的列表UserAgents中随机挑选一个浏览器的名称,并把它设置为当前缺省的用户代理[8]。

2.2.3  文件resource.py

该文件是用户代理列表文件,在zmiddlewares目录下,在其中定义列表UserAgents,该列表中存放的是30个不同的浏览器的名称[9]。

2.2.4  文件items.py

该文件定义要爬取的数据项。

2.2.5  文件middlewares.py

该文件中的类class ProxyDownloaderMiddleware,用来设置隧道代理服务器的域名、端口号、用户名、密码等[10]。

2.2.6  文件pipelines.py

该文件输出文本文件“z0421test.txt”,每行的四个数分别表示用户标识号ID,该用户已发表的微博数、关注数和粉丝数等。

2.2.7  文件settings.py

该文件是配置文件,给出了一些参数的值。

1)DOWNLOAD_DELAY = 6,代表爬虫访问完一个页面再访问下一个页面时需要等待的时间间隔。如果间隔时间太短,网站会发现是爬虫在访问网站,从而拒绝访问。

2)COOKIES_ENABLED = False,设置为不用cookies。如果使能cookies,则微博网站会发现每次是同一个用户在访问该网站,从而拒绝访问。

3)程序如何输出。如下结构中的内容表明使用项目zSinaUser中文件pipelines.py中的类class ZsinauserPipeline来输出:

ITEM_PIPELINES = {'zSinaUser.pipelines.ZsinauserPipeline': 300,}

4)ROBOTSTXT_OBEY = False:表示爬取内容不符合robots协议时仍要爬取[11]。

2.2.8  文件begin.py

调试运行程序时文件begin.py应用说明如下:

1)在Python的集成开发环境PyCharm中,为了避免每一次运行或调试程序都输入一串命令,可以在工程目录“>cd G:\gzhuyehang\scrapyProject\zSinaUser”下创建一个文件,名字可为begin.py,也可命名为其他名字。在PyCharm的运行选项配置中写入该文件名字,这样每次点击运行菜单命令时就会首先运行该文件的脚本,从而启动该爬虫工作,下载网站上的相关数据[12]。该文件内容如下:

from scrapy import cmdline

cmdline.execute('scrapy crawl userInfoSpider'.split())

其中“userInfoSpider”为本文2.1.3节中给出的名字,是该爬虫的名字。

2)若想在命令行模式下调试运行程序,就不需要文件begin.py,可直接进入命令行模式,运行命令:>scrapy crawl userInfoSpider。

2.2.9  文件scrapy.cfg

該文件是整个Scrapy项目的配置文件,其内容如下:

[settings]

default = zSinaUser.settings

[deploy]

#url = http://localhost:6800/

project = zSinaUser

该文件声明了两件事,一是定义默认设置文件的位置为zSinaUser目录下的settings.py文件,二是定义项目名称为zSinaUser。

2.3  获取cookie步骤

步骤如下:

1)用谷歌浏览器Chrome打开网址https://www.weibo.com/。

2)点击“立即登录”,完成手机验证码验证,进入微博平台里面。

3)按键盘功能键F12打开开发者工具(或鼠标右击网页空白处,在弹出菜单中点击条目“检查”),在Network标签下选择Fetch/XHR,在页面左侧的Name框中点击某一行,再在页面右侧的标签Headers下的Request Headers下,找到“Cookie: ”后的值,把它复制拷贝到文件settings.py中结构DEFAULT_REQUEST_HEADERS的关键词“cookie”后,如下所示[13]:

DEFAULT_REQUEST_HEADERS = {   'Accept-Language': 'en',

'cookie':'SINAGLOBAL=3374182609874.5854. ……Num%22%3A42%2C%22msgbox%22%3A0%7D'}

2.4  用户代理

若总是用同一个浏览器访问微博网站,网站就会发觉是爬虫在访问它从而拒绝访问。为了不让微博网站发现是程序在访问,在下载微博期间可不断变换浏览器名称,具体做法是每次从浏览器名称列表中随机挑选出一个浏览器名称来访问微博网站,这样浏览器名称在不断变化,微博网站就会认为是不同的用户在访问它,从而不会拒绝访问。在文件settings.py中的结构DOWNLOADER_MIDDLEWARES中,如下显示的前一行表示使用我们自己提供的可不断变换挑选的用户代理,后一行表示禁用框架Scrapy中原有的用户代理[14]。

DOWNLOADER_MIDDLEWARES = {    ……

'zSinaUser.zmiddlewares.customUserAgent.RandomUserAgent':30,

'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,   }

其中前一行表示启用目录zSinaUser下的目录zmiddlewares下的文件customUserAgent.py中的类class RandomUserAgent来设置本次请求访问Request所使用的用户代理的值,具体实现的语句如下:

ua = random.choice(UserAgents)

request.headers.setdefault('User-Agent',ua)

前一句表示从文件resource.py中的列表UserAgents中随机挑选一个浏览器的名称,后一句表示把挑选出的浏览器的名称设置为当前请求Request的用户代理[8]。

文件resource.py中用户代理列表UserAgents的内容是30个不同的浏览器的名称,内容如下所示:

UserAgents = [    "Mozilla/5.0 (Linux; U; Android 1.5; en-us; sdk Build/CUPCAKE) AppleWebkit/528.5  (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.

20.1",    ……….]

2.5  IP代理

若长时间总是用同一个IP地址访问微博网站,那微博网站就会发现是爬虫在访问它,从而拒绝访问。为此我们从快代理公司购买了隧道代理服务功能,可在访问网站的过程中每隔一定时间变换IP值,比如每隔一分钟变换一次IP值,而且这些IP值是从上万个不同的IP值中选出,从而基本上不重复,这就让微博网站难以发现是爬虫程序在下载数据[15]。

为此我们在文件settings.py中的结构DOWNLOADER_MIDDLEWARES中,设置了一项,如下所示:

DOWNLOADER_MIDDLEWARES = {…… 'zSinaUser.middlewares.ProxyDownloaderMiddleware': 100,}

即调用目录zSinaUser下的文件middlewares.py中的类class ProxyDownloaderMiddleware,设置隧道代理服务器域名、端口号、用户名、密码等。

3  实验方案

3.1  实验过程

本节说明如何通过Scrapy框架网络爬虫批量抓取微博用户信息。

3.1.1  输入

要爬取的微博用户的ID标识号,集中放在一个文本文件“z0420userid.txt”中,其前5行和最后5行内容如图2所示,共有7 754行数据,按ID标识号顺序从小到大排列。

3.1.2  输出

输出文件“z0421test.txt”前5行和最后5行的截图如图3所示,按微博用户ID标识号升序排列,每行的四个数分别表示该行对应的微博用户的标识号ID,已发表的微博数、关注数和粉丝数,要注意的是用户粉丝数中的值有的单位是“个”,而有的单位是“万”,还有的单位是“亿”。

3.2  实验结果分析

3.2.1  输入与输出分析

输入是7 754行,而输出是7 639行,输出比输入的行数少了115行。这是由于有些微博用户在输出前已经被新浪微博网站删除,从而不存在了;还有些是由于网络不稳定,导致在规定的时间内没有下载到相关的数据,从而造成缺失。为此,找出缺失的这115行微博用户的ID标识号,把它们重新输入该网络爬虫,运行结果得到其中107个微博用户的标识号ID、微博数、关注数和粉丝数信息,仍未下载到数据的另外8个微博用户,经人工上网查找,发现它们已经被新浪微博网站删除,已不存在了。

3.2.2  处理时间分析

下载输入文件“z0420userid.txt”中的七千多名微博用户的信息耗时6小时22分钟,这是在Scrapy框架爬虫的配置文件即本文2.2.7节文件settings.py中的参数DOWNLOAD_DELAY = 6时得到的结果,该参数用于人为设置接连两次访问微博网站的时间间隔。如果该参数值设置为更小的值比如“3”,则会更快地下载完这七千多名微博用户的信息,但风险是有可能被新浪微博网站识别出是爬虫在访问它,从而被拒绝访问,更严重的后果是被封号,那样得不偿失,反倒要花更多的时间、更慢了。所以这个参数的值应该权衡利弊慎重选择。

4  结  论

本文用Python语言设计并实现了一个基于Scrapy框架的网络爬虫,能够根据输入的用户标识号ID从新浪微博网站下载到该用户目前已发表的微博数、关注数和粉丝数等信息。下载七千多微博用户信息需要6小时22分钟,影响下载时长的一个重要参数是接连两次访问新浪微博网站的时间间隔,如果该参数值设置太小,微博网站会识别出是爬虫在访问它,从而会拒绝訪问,甚至封号,确定该间隔值的最佳值是今后要进一步研究的问题。

参考文献:

[1] 孙握瑜.基于Python的新浪微博爬虫程序设计与实现 [J].科技资讯,2022,20(12):34-37.

[2] 史媛.基于Scrapy框架爬取豆瓣图书的设计与实现 [J].山西电子技术,2022(4):75-77+86.

[3] 王嘉宝,雒伟群.基于Scrapy框架的电影数据爬取和可视化分析 [J].西藏科技,2022(2):64-68.

[4] 邢娅凯.基于Scrapy框架爬虫和数据挖掘的当当网页信息分析 [D].长沙:湘潭大学,2020.

[5] 孙瑜.基于Scrapy框架的网络爬虫系统的设计与实现 [D].北京:北京交通大学,2019.

[6] 何波.基于Python的新浪微博中爬虫程序维护方法 [J].软件,2022,43(2):52-54.

[7] 汪兵.基于Scrapy框架的分布式爬虫系统设计与实现 [D].合肥:合肥工业大学,2019.

[8] 魏海昱,林伟鸿,贺超波.基于Scrapy的食品安全舆情数据爬取与分析 [J].现代计算机,2022,28(14):49-54+95.

[9] 樊宇豪.基于Scrapy的分布式网络爬虫系统设计与实现 [D].成都:电子科技大学,2018.

[10] 杨君.基于Scrapy技术的数据采集系统的设计与实现 [D].南京:南京邮电大学,2018.

[11] 董少林,李钟慎.采用Scrapy分布式爬虫技术的微博热点舆情信息获取与分析 [J].电脑与信息技术,2020,28(5):23-26.

[12] 谢钢.基于Scrapy的信息采集与分析 [J].现代信息科技,2020,4(14):96-98.

[13] 周毅,李威,何金,等.基于Scrapy框架的分布式网络爬虫系统设计与实现 [J].现代信息科技,2021,5(19):43-46.

[14] 邹维,李廷元.基于Scrapy爬虫框架的领域网站文件爬取 [J].现代信息科技,2020,4(21):6-9.

[15] 阎泽群.基于网络爬虫技术的大数据采集系统设计 [J].现代信息科技,2021,5(12):83-86.

作者简介:朱烨行(1969—),男,汉族,陕西渭南人,副教授,博士,研究方向:数据挖掘;通讯作者:赵宝莹(1985—),女,汉族,河南洛阳人,讲师,硕士,研究方向:教育技术;张明杰(1977—),男,汉族,陕西铜川人,副教授,博士,研究方向:互联网舆情分析;魏笑笑(1979—),女,汉族,湖南益阳人,副教授,硕士,研究方向:信息资源管理;卫昆(1976—),男,汉族,江苏昆山人,讲师,博士,研究方向:数据挖掘。

收稿日期:2023-04-19

基金项目:陕西省社会科学基金项目(2020R048);陕西省科技计划项目(2021GY-180);陕西省科技厅项目(2021JM-467);陕西省教育厅科研计划项目(20JZ086)

猜你喜欢

网络爬虫微博
何以解忧?基于社交媒体大数据的睡眠健康公众叙事研究
炼铁厂铁量网页数据获取系统的设计与实现
“985工程”高校图书馆阅读推广的调查与分析
事实与流言的博弈
关于高中语文教学中微博的有效运用思考
基于社会网络分析的权威网页挖掘研究
主题搜索引擎中网络爬虫的实现研究
浅析如何应对网络爬虫流量
网络爬虫针对“反爬”网站的爬取策略研究
神回复