基于Python和Requests快速获取网页数据的方法研究

2023-09-25 11:07姜庆玲张樊
现代信息科技 2023年16期

姜庆玲 张樊

摘  要:随着“互联网+”和大数据时代的到来,网络上充斥着各种各样的数据,过滤并获取有用的数据在当今环境下至关重要。文章提出一种基于Python和Requests模块的快速获取网页数据的方法,使用该方法可以获取解析前的网页源代码文本和图片数据,并保存为本地文件,为之后的数据分析和深入学习大数据技术奠定基础。实验结果表明,该方法步骤和代码编写简单易学,运行结果较好,具有一定的实用性。

关键词:Python技术;Requests模块;网络图片爬取

中图分类号:TP312.1;TP393   文献标识码:A   文章编号:2096-4706(2023)16-0100-05

Research on Method of Quickly Obtaining Web Data Based on Python and Requests

JIANG Qingling, ZHANG Fan

(Wuchang Institute of Technology, Wuhan  430065, China)

Abstract: With the arrival of the “Internet+” and big data era, the network is full of all kinds of data. Filtering and obtaining useful data is crucial in today's environment. This paper proposes a method to quickly acquire web data based on Python and Requests modules. Using this method, you can obtain the text and image data of the web source code before parsing, and save them as local files, laying the foundation for later data analysis and in-depth study of big data technology. The experimental results show that the steps and coding of this method are easy to learn, the running results are good, and it has certain practicability.

Keywords: Python technology; Requests module; network image crawling

0  引  言

近年來,随着国家“互联网+”行动的提出,各行各业都开始关注互联网技术的发展,这也促进了大数据时代的到来。在大数据时代下,文字和图片信息也逐步数字化,出现在大小屏幕上,人们获取信息的方式更加快捷和多样。大量的数据逐步堆积在网络上,人们接收的信息也逐渐庞大,而其中有些信息,人们并不需要。这时,一种能过滤信息的技术就会应运而生,Python语言就可以很好地帮助人们过滤并获取有用的信息。本文将介绍基于Python语言下获取网页数据的方法,该方法简单易实现,能够获取网页文本和图片数据。

纵观近5年国内在Python技术中获取网页信息的文献,有大量的网页爬虫框架的研究,例如基于Scrapy爬虫框架的研究有新浪微博数据爬虫研究[1]、房产信息爬取系统设计[2]、分布式获取当当网图书数据[3]、食品安全舆论数据爬取与分析[4]、研招网硕士目录爬虫的设计与实现[5]等。除了Scrapy爬虫技术的研究,还有学者对主流的爬虫技术的研究,例如杨健[6]等学者就对基于Python技术的三种网络爬虫框架(Requests、Scrapy、Selenium)进行了研究,分析了这三种爬虫技术的各自优势和适用场合。根据已有的研究成果,经过各种技术的比较验证后,在确保获取信息效果正确的前提下,Requests库代码量和步骤都较少,简单易学,适合读者验证并投入使用。综上所述,本文将使用Requests库实现获取网页的文本和图片数据。

1  相关技术

1.1  Python语言

Python由吉多·范罗苏姆(Guido van Rossum)于20世纪90年代初设计,作为一门叫作ABC语言的替代品,吉多·范罗苏姆曾在于20世纪80年代曾在ABC系统开发中工作了数年,ABC语言定位为一种交互式的结构化高级语言,旨在替代BASIC、Pascal等语言,用于教学及原型软件设计,它专注于编程初学者,但是存在平台迁移能力弱且难以添加新功能等问题,以至于ABC语言并未成功。Python继承了ABC语言的优点,能够让编程初学者易学上手,并解决了前者的致命性问题,确保了拓展模块的编写和跨平台运行。

Python基于上述优点,应用起来非常方便,迅速流行起来,也逐步推动了其自身的发展。现在的Python语言拥有丰富的库、面向对象、免费开源、可扩展性、可嵌入性、可进行高级动态编码、适合做科学计算等诸多优点,也促使了大数据和人工智能的发展,就连国内高等教育中,Python语言程序设计已经成为基础学科。

在语法方面,区别于其他高级语言,Python语言必须使用4个空格来表示每级缩进,缩进是语法的一部分。除此之外,Python语法和其他高级语言类似,例如数据类型、表达式、语句、函数、对象等语法,仅部分写法有些差别。

Python拥有丰富的库,可拓展性极强,应用领域非常广泛,主要应用于软件开发、科学计算和统计、人工智能、图像处理、数字和文本处理、数据库编程、网络编程、多媒体应用、游戏引擎、黑客编程等多个领域。

1.2  Requests模块

Requests模块是Python丰富的库文件中的一种,是一个基于Apache2协议开源的Python HTTP库。它是爬虫技术的基础,号称是“为人类准备的HTTP库”。在Python语言中,系统自带的urllib和urllib2都提供了功能强大的HTTP支持,但是API接口确实太难用了,这才有了Requests库的产生。在Requests模块中,请求一个网页地址,只需要一句代码。

使用Requests模块的步骤如下:

1)解析网址URL的格式和参数;

2)设置网络请求参数;

3)选择合适的请求方式发送网络请求;

4)根据网络请求状态码判断是否获取成功,如果成功,接收并保存数据;

5)根据需要解码数据。

2  步骤详解

2.1  解析网址URL

在上述步骤第一步中,网址URL通用格式为:

:////#

<方案>://<主机>:<端口>/<路径>/<参数>?<查询>#<锚点>

其中:

表示访问服务器获取资源所使用的协议,例如http、https、ftp等。

表示资源宿主服务器的主机名、ip地址或域名。

表示資源宿主服务器正在监听的端口号,例如http默认为80、https默认是443等。

表示服务器上资源的路径,由斜杠(/)与前面URL组件分隔开。

表示服务器上资源规定的参数。

表示资源的查找条件,用问号(?)与URL其余组件分隔开。

表示网页锚点,用于标记一个网页中部分内容。

根据上述合法的网址格式,可举例如下:

http://www.baidu.com/s?wd=狗

http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=杨紫

2.2  设置网络请求参数

在确定好要爬取的网页URL后,点击页面右键的“检查”选择项后,出现如图1所示的界面,在该界面中,依次选择“网络”选项卡、“文档”选项卡,点击对应网址后,查看标头里面的User Agent,这就是需要设置的网络请求参数。

User Agent简称UA,表示用户代理,是软件提供的一个标识自己身份的标识符,包含了用户正在使用的设备以及软件的一些信息,例如浏览器、版本、浏览器渲染引擎等。不同的浏览器其User Agent不同,因此需要在发送请求之前设置好该参数。

2.3  发送网络请求

网络请求主要用于资源访问、接口数据的请求、传下载文件等操作。常见的请求方式主要包括GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS等,其中GET和POST请求使用最频繁。

2.3.1  GET请求方式

GET请求主要用于获取资源,对服务器上资源不会产生影响,它可以把请求的一些参数信息拼接在URL上,传递给服务器,由服务器端进行参数信息解析,然后返回相应的资源给请求者。需要注意的是,GET请求拼接的URL数据大小和长度是有最大限制的,传输的数据量一般限制在2 KB。

2.3.2  POST请求方式

POST请求执行提交信息、传输信息的操作,对服务器上资源会产生影响,一般用于例如注册、登录、上传文件(百度云盘)等操作。POST请求传递的一些数据和参数不是直接拼接在URL后的,而是放在Http请求Body里。相对GET请求来说,POST请求比较安全,并且传递的数据大小和格式是无限制的。

本文中获取网页数据并不需要修改服务器上资源,不需要严格的安全性要求,且需要传递的数据量并不大,综合考虑后,采用GET方式发送网络请求。

2.4  判断网络请求状态码

在Requests模块中,常见的网络请求状态码如表1所示。

如果状态码是200,则应该将请求返回的结果保存起来,使用Python中的with语句实现:

with open('保存路径','读取模式') as f:

f.write(需要保存的内容)

其中读取模式有b(二进制)、r(只读),w(只写),a(追加),如果最后有+号,表示文档可读可写。其中,需要注意的是,写入一般会覆盖原文件,追加则在原文件尾部开始写,如果文件不存在,w,w+,a,a+,wb会创建新文件。

2.5  解码数据

网页中有些数据在返回的过程中存在加密的代码,那么这样就无法得到想要的数据,这事就需要解码,例如将返回的内容存为txt文本格式,一般需要解码为“UTF-8”的格式,这时需要使用decode("utf8")实现。

3  获取网页数据的具体实现

3.1  编程环境

本文在Window 10操作系统下安装Python 3.7.4版本,集成开发环境IDE使用PyCharm Community版本,浏览器使用Chrome。

在PyCharm中创建项目,并安装Requests库,安装成功后如图2所示。

3.2  获取网页源代码文本

以获取百度页面的代码为例,其网址为“https://www.baidu.com”。如果想获取其源代码,可以发现右键查看源代码,并不是真正的源代码,是服务器经过解析后返回的代码,如图3所示。

那么想得到真正的源代码就必须在服务器解析之前就获取,使用Requests库发送请求就可以实现,按照上述步骤,获取网址后,设置对应的User Agent为“Mozilla/5.0 (Windows NT 10.0; Win 64; x 64)

AppleWebKit/537.36 (KHTML, like Gecko) Chrome/

111.0.0.0 Safari/537.36”,编写Python代码如下:

import requests   #导入requests库

#1.网址URL

url="https://www.baidu.com"

#2.设置请求参数

headers={

"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"

}

#3.发送GET请求获取页面

res=requests.get(url,headers=headers)

#4.保存返回内容

content=res.content.decode("utf8")  # 应使用二进制bytes流,并解码为utf-8

#5.获取的内容进行存储

with open('baidu.txt','w') as f:

f.write(content)

运行程序后,会在当前程序的同级目录下生成一个“baidu.txt”的文本文件,内容如图4所示。

将上述文件另存为UTF-8格式后,修改后缀名为“html”,再打开就是一个静态的百度页面。

3.3  获取网页图片

以获取百度图片中“萌宠”图片为例,选择器任意一张图片并右键复制链接地址,根据选择的图片地址,编写代码如下:

import requests

url="https://img2.baidu.com/it/u=4117544783,3162221579&fm=253&fmt=auto&app=138&f=JPEG?w=281&h=499"

headers={

"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"

}

res=requests.get(url,headers=headers)

print(res)

content=res.content   #圖片是二进制文件,因此不用解码

#保存图片文件

with open("animal.png",'wb') as f:

f.write(content)

运行结果如图5所示。

4  结  论

本文通过Python语言结合Requests模块实现了简单的网页中源代码文本和图片数据的获取,经试验验证,本文使用的实现思路、步骤和代码编写均简单易学,实现效果较好。在“互联网+”和大数据时代背景下,能够为学习爬虫框架、获取大量网络数据并进行数据分析、深入研究大数据和人工智能技术奠定数据基础。

参考文献:

[1] 邓晓璐,姚松.基于Scrapy的新浪微博数据爬虫研究 [J].现代信息科技,2023,7(3):44-47.

[2] 曾水新,黄日胜.基于Scrapy的房产信息爬取系统设计 [J].电脑编程技巧与维护,2022(12):26-28.

[3] 胡学军,李嘉诚.基于Scrapy-Redis的分布式爬取当当网图书数据 [J].软件工程,2022,25(10):8-11.

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

[5] 伍高巍,刘杰,葛晓龙,等.基于Scrapy的研招网硕士目录爬虫的设计与实现 [J].电脑知识与技术,2022,17(18):53-55.

[6] 杨健,陈伟.基于Python的三种网络爬虫技术研究 [J].软件工程,2023,26(2):24-27+19.

作者简介:姜庆玲(1991.05—),女,汉族,湖北孝感人,教师,硕士,研究方向:计算机基础应用,数据分析与数据挖掘。