Hello,Spider!入门第一个爬虫程序

在各大编程语言中,初学者要学会编写的第一个简单程序一般就是“Hello, World!”,即通过程序来在屏幕上输出一行“Hello, World!”这样的文字,在Python中,只需一行代码就可以做到。我们把这第一个爬虫就称之为“HelloSpider”,见下例。

import lxml.html,requests
url = 'https://www.python.org/dev/peps/pep-0020/'
xpath = '//*[@id="the-zen-of-python"]/pre/text()'
res = requests.get(url)
ht = lxml.html.fromstring(res.text)
text = ht.xpath(xpath)
print('Hello,\n'+''.join(text))

运行结果:
在这里插入图片描述
代码分析:

  1. 导入模块
import lxml.html,requests

这里我们使用import导入了两个模块,分别是lxml库中的html以及python中著名的requests库。lxml是用于解析XML和HTML的工具,可以使用xpath和css来定位元素,而requests则是著名的Python HTTP库,其口号是“给人类用的HTTP”,相比于Python自带的urllib库而言,requests的有着不少优点,使用起来十分简单,接口设计也非常合理。实际上,对Python比较熟悉的话就会知道,在Python 2中一度存在着urllib, urllib2, urllib3, httplib, httplib2等一堆让人易于混淆的库,可能官方也察觉到了这个缺点,Python 3中的新标准库urllib就比Python 2好用一些。曾有人在网上问道“urllib, urllib2, urllib3的区别是什么,怎么用”,有人回答“为什么不去用requests呢?”,可见requests的确有着十分突出的优点。同时也建议读者,尤其是刚刚接触网络爬虫的人采用requests,可谓省时省力。

  1. 定义变量
url = 'https://www.python.org/dev/peps/pep-0020/'
xpath = '//*[@id="the-zen-of-python"]/pre/text()'

这里我们定义了两个变量,Python不需要声明变量的类型,url和xpath会自动被识别为字符串类型。url是一个网页的链接,可以直接在浏览器中打开,页面中包含了Python之禅的文本信息。xpath变量则是一个xpath路径表达式,我们刚才提到,lxml库可以使用xpath来定位元素,当然,定位网页中元素的方法不止xpath一种,以后我们会介绍更多的定位方法。

  1. re get 数据
res = requests.get(url)

使用了requests中的get方法,对url发送了一个HTTP GET请求,返回值被赋值给res,于是我们便得到了一个名为res的Response对象,接下来就可以从这个Response对象中获取我们想要的信息。

  1. 处理html
ht = lxml.html.fromstring(res.text)

lxml.html是lxml下的一个模块,顾名思义,主要负责处理HTML。fromstring方法传入的参数是res.text,即刚才我们提到的Response对象的text(文本)内容。在fromstring函数的doc string中(文档字符串,即此方法的说明)说道,这个方法可以“Parse the html, returning a single element/document.”即fromstring根据这段文本来构建一个lxml中的HtmlElement对象。

  1. 输出
text = ht.xpath(xpath)
print('Hello,\n'+''.join(text))

这两行代码使用xpath来定位HtmlElement中的信息,并进行输出。text就是我们得到的结果,“.join()”是一个字符串方法,用于将序列中的元素以指定的字符连接生成一个新的字符串。因为我们的text是一个list对象,所以使用‘’这个空字符来连接。
如果不进行这个操作而直接输出:程序会报错,出现‘TypeError: Can’t convert ‘list’ object to str implicitly’这样的错误。当然,对于list序列而言,我们还可以通过一段循环来输出其中的内容。

思考
通过刚才这个十分简单的爬虫示例,我们不难发现,爬虫的核心任务就是访问某个站点(一般为一个URL地址)然后提取其中的特定信息,之后对数据进行处理(在这个例子中只是简单地输出)。当然,根据具体的应用场景,爬虫可能还需要很多其他的功能,比如自动抓取多个页面、处理表单、对数据进行存储或者清洗等等。
其实,如果我们只是想获取特定网站所提供的关键数据,而每个网站都提供了自己的API (应用程序接口,Application Programming Interface),那么我们对于网络爬虫的需求可能就没有那么大了。毕竟,如果网站已经为我们准备好了特定格式的数据,只需要访问API就能够得到所需的信息,那么又有谁愿意费时费力地编写复杂的信息抽取程序呢?现实是,虽然有很多网站都提供了可供普通用户使用的API,但其中很多功能往往是面向商业的收费服务。另外,API毕竟是官方定义的,免费的格式化数据不一定能够满足我们的需求。掌握一些网络爬虫编写,不仅能够做出只属于自己的功能,还能在某种程度上拥有一个高度个性化的“浏览器”,因此,学习爬虫相关知识还是很有必要的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/543030.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

职场中的职业素养与成功之路

在职场中,职业素养是衡量一个人成功与否的重要标准。一个人的职业素养不仅影响个人发展,还关系到整个团队和组织的效益。本文将探讨职场中职业素养的重要性以及如何提升自身的职业素养,从而在职场中取得成功。 一、职业素养的重要性 1. 形象塑…

智慧公厕建设,助力打造宜居、韧性、可持续的智慧城市

公共厕所作为智慧城市的重要组成部分,对于城市的高质量发展起着至关重要的作用。智慧公厕建设旨在通过全面监测、控制和管理公共厕所,实现多方面功能,包括公共厕所环境监测与调控、厕位占用监测与引导、消耗品监测与缺失提示、安全防范与管理…

ElementUI Message 消息提示,多个显示被覆盖的问题

现象截图&#xff1a; 代码&#xff1a;主要是在this.$message 方法外层加上 setTimeout 方法 <script> export default {name: "HelloWorld",props: {msg: String,},methods: {showMessage() {for (let i 0; i < 10; i) {setTimeout(() > {this.$mess…

ThingsBoard Edge 设备控制

文章目录 一、RPC 功能1.服务端 RPC2.客户端 RPC3.MQTT RPC API3.1.服务端RPC3.2.客户端RPC 二、设备控制1.环境准备2.创建设备3.服务端PRC3.1.RPC消息主题3.2.程序源码3.3.创建仪表板3.4.边缘分配仪表板3.5.测试 4.客户端RPC4.1.RPC消息主题4.2.程序源码4.3.规则链4.4.测试 Th…

【析】一类动态车辆路径问题模型和两阶段算法

一类动态车辆路径问题模型和两阶段算法 摘要 针对一类动态车辆路径问题&#xff0c;分析4种主要类型动态信息对传统车辆路径问题的本质影响&#xff0c;将动态车辆路径问题(Dynamic Vehicle Routing Problem, DVRP)转化为多个静态的多车型开放式车辆路径问题(The Fleet Size a…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水下目标检测系统(深度学习模型+UI界面+训练数据集)

摘要&#xff1a;本研究详述了一种采用深度学习技术的水下目标检测系统&#xff0c;该系统集成了最新的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别水…

2215.找出两数组的不同

题目&#xff1a;给两个下标从0开始的整数数组nums1和nums2&#xff0c;返回一个长度为2的列表answer&#xff0c;其中&#xff1a; answer[0]是nums1中所有不存在于nums2中的不同整数组成的列表。 answer[1]是nums2中所有不存在于nums1中的不同整数组成的列表。 解题思路&am…

BUGKU-WEB cookies

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 看源码看F12&#xff1a;看请求链接看提示&#xff1a;cookies欺骗 相关工具 插件&#xff1a;ModHeader或者hackbarbase64解密 解题步骤 看源码 就是rfrgrggggggoaihegfdiofi48ty598whrefeoia…

spring-boot操作elasticsearch

一、环境准备 springboot与elasticsearch的更新都非常快&#xff0c;为了避免兼容性问题&#xff0c;要注意下选择的版本问题。具体的可参考官网 --> springboot与elasticsearch版本兼容性 1.1导入依赖 <dependencies><dependency><groupId>org.spring…

【CKA模拟题】查询消耗CPU最多的Pod

题干 For this question, please set this context (In exam, diff cluster name) 对于此问题&#xff0c;请设置此上下文&#xff08;在考试中&#xff0c;diff 集群名称&#xff09; kubectl config use-context kubernetes-adminkubernetesFind the pod that consumes the …

算法笔记 连载中。。。

HashMap&#xff08;会根据key值自动排序&#xff09; HashMap<String, Integer> hash new HashMap<>() hash.put(15,18) hash.getOrDefault(ts, -1) //如果ts(key)存在&#xff0c;返回对应的value 否则返回-1 hashMap1.get(words1[i])1会报错&#xff0c;因…

基于物联网的智能农业种植管理系统设计

传统农业种植中对农作物种植环境的掌控更多的是依靠个人的经验。科学技术的进步可逐步改变人们对农作物种植环境变化的感知&#xff0c;因此&#xff0c;以物联网技术对嵌入式、传感及控制等技术的整合而实现一款可对农作物种植环境中是否下雨、土壤湿度等变化施以监测并完成自…