一篇文章带你入门爬虫并编写自己的第一个爬虫程序

news2024/11/17 0:36:00

一、引言

        目前我们处在一个信息快速迭代更新的时代,海量的数据以大爆炸的形式出现在网络之中,相比起过去那个通过广播无线电、书籍报刊等传统媒介获取信息的方式,我们现在通过网络使用搜索引擎几乎可以获得任何我们需要的信息资源。

        但与此同时信息的大爆炸也带来了一定的问题——网络资源的纷繁复杂大大降低了我们获取信息的效率,我们所获取的数据中有很大一部分是无效的、多余的垃圾数据。在这样的数据大浪之中,我们如何简单地筛选、获取到自己所需要的信息并加以有序地整合呢?答案是——使用程序进行对数据进行爬取然后对所获得的数据进行规则地划分与整理,以供进一步使用与分析。

 

二、爬虫简介

        网络爬虫(也被称为网页蜘蛛,网络机器人),是一种模拟浏览器行为,向网页端发起请求(request),接受网页端发回的响应(response),自动抓取互联网信息的程序。网络爬虫的出现大大地方便了我们对网络上的信息进行高效的收集分析整合,降低了人力成本。

 

三、注意事项

        爬虫技术虽然强大,大大方便了我们对信息的获取。但需要注意的是,所有的技术都需要在法律允许的范围内行使。网上的一些数据比如公民的个人敏感信息或者一些明确标注了不可爬取的数据我们就不应该逾越界限进行爬取,同时爬虫程序频繁地向目标网站发送请求可能会使目标服务器承担过大的负载,我们在使用爬虫程序时应当遵守网站的爬虫协议与使用条款,避免侵犯网站权益。

 

四、环境准备(Requirements)

        一般我们使用Python编写爬虫程序,因为使用Python来进行爬虫程序的编写比较简单,Python有十分强大的库资源,支持我们进行各种各样的操作:

        Python==3.10.14 (选择一个适中的版本即可)

        requests (pip install requests)

        bs4 (pip install bs4)

 

五、爬虫基本流程介绍

        编写一个典型的爬虫程序一般需要经历三个步骤:

        ①模拟浏览器向目标网站发送请求,获取网站响应

        ②分析网站响应内容,定位所需数据位置

        ③爬取数据

 

六、实战训练:爬取豆瓣电影top250

        接下来我们将以爬取豆瓣电影top250作为案例,在爬虫实战中逐个具体讲解每一个步骤如何在python中利用代码进行实现。

f9abf18454484ccfb4201f7f2e1f19c6.png

        首先,我们先在python程序中导入我们预先下载好的库:

25ab54d016e141268f55e2091e5c86bb.png

        第一步:模拟浏览器向目标网站发送请求,获取网站响应

        首先,我们需要明确所需要爬取网页的地址(url):https://movie.douban.com/top250

05652fc7f4974bbfa31bbb3829012a0e.png

        然后我们需要向这个网站发送请求,这里就需要用到requests模块

0ad44fdfde2b40d0ba566db3e9948a77.png

        这行代码就表示向target_url发送请求,并把请求的结果赋给response变量,我们试着打印一下response

61790c7a7a654d8dae079d3a4c1df09e.png

        发现返回的结果为:

0137f5b2bff8441ba6a0545d0eea28f7.png

        这实际上是一个HTTP响应状态码,HTTP响应状态码用来表明HTTP请求的状态,主要可以分为五个大类:

  1. 信息响应类(100-199)
  2. 成功响应类(200-299)
  3. 重定向消息(300-399)
  4. 客户端错误响应(400-499)
  5. 服务器错误响应(500-599)

        所以HTTP响应状态码为418说明我们的HTTP请求被拒绝了。但不要灰心,这属于正常现象,因为我们没有对我们的爬虫程序做任何伪装,会被网站自动地识别为异常请求,所以我们的请求理所当然会被拒绝。

        那么我们如何对我们的爬虫程序做伪装呢?对于豆瓣top250这个网页,这种伪装很简单,只需要在发送请求时多加一个参数headers来把爬虫程序伪装成浏览器行为即可,具体操作如下:

        我们打开浏览器(笔者这里使用谷歌的Chrome浏览器)按下F12,或者右键鼠标,选择“检查”选项,进入Network面板(可能需要刷新一遍网页才能看到笔者如下的界面),这里记录和分析了网页加载过程中由我们向网站发出的网络请求,包括请求头、响应头等等关键的信息,而我们需要的正是给我们的爬虫程序加上一个请求头(Request Headers),来把自己打扮得像浏览器一些,以此“萌”混过关。

1931989e1a2e4f88b669a0deeaa2a224.png

        我们对豆瓣top250界面进行爬取,只需要在添加一个包含User-Agent的headers(如下图所示),我们将具体内容直接复制即可。

3869e9955efd4b429b08e7478743d29a.png

        具体代码如下:

7c8879c2dec54e4ea47f1cd21ebeb243.png

        接下来运行程序,得到输出:

9fd6e79df4e6496caa6c4d4e0987bb13.png

        发现Response发生了改变,还记得我们之前说的HTTP响应状态码吗?加上了header的请求返回了200,这说明我们已经成功地向服务器发送了请求。

        接下来要获得页面的具体内容就很简单了:

15123b0d495d41b18508d536db00e2c4.png
c9416e4eb11b41deb833cd77992b4599.png

        这样我们就可以直接获得网页的具体内容了,实际上我们得到的内容就是“网页源代码”,即源HTML文件,而如果想要了解HTML文件的相关信息,请移步笔者之前的一篇文章:初识HTML文件,创建自己的第一个网页!,了解HTML文件对理解爬虫程序会有很大的帮助!

        就这样,我们获得了页面的源代码,网页上所有的信息都被我们保存在了html_text这个变量里,那么接下来如何获取到我们所需要的电影排行数据呢?这样就来到了下一步。

 

        第二步+第三步:分析网站响应内容,定位所需数据位置+爬取数据

        我们得到的页面源代码信息量巨大,包含了许多不被我们所需要的数据,所以我们要进行一定的滤过操作,舍弃掉我们不需要的数据,获取我们需要的数据。

        在正式讲解获取目标数据的具体操作之前,我们不妨回顾一下笔者在先前一篇文章:一文讲透如何使用CSS美化HTML界面中介绍CSS样式表语言时提到的在CSS样式表中如何定位目标元素。HTML与CSS提供了一套简单易懂的定位语言,这也大大方便了我们在编写爬虫程序时使程序锁定目标数据。

        想象一下,现在你正面对着这样一个HTML文件,那么你该如何用CSS对“肖申克的救赎”这段文本进行定位呢?

8284272919f148dfae5110e92db386c3.png

        我们不难发现,我们所需要的信息,依次放在:<ol class=”grid_view”> => <li> => <span class=”title”>下。

bf60f9f33a404ae1a863787ed4527e9a.png

        我们再观察一下别的标题是否也是如此:

4f988aa7caf64c4f929b2062e674df84.png

        我们发现,“霸王别姬”也依次放在依次放在:<ol class=”grid_view”> => <li> => <span class=”title”>下。

        所以我们需要做的,首先是抓取<ol class=”grid_view”>,这一ol无序表包含的每一个<li>都包含了一部影片的信息,我们需要在每个<li>中再去找到<span class=”title”>,那么具体该如何实现呢?我们就需要请出一个专门用于解析HTML网页的python库——Beautifulsoup了,这个库可以使我们很方便地解析HTML界面元素。

        首先,使程序按HTML文件格式去解析方才得到的网页源代码文本:

8fb71f2a3fdc4366a6fd8c0b5a48380a.png

        之后我们就可以进行元素的定位了:

        先定位到<ol class=”grid_view”>,使用find函数(返回第一个符合条件的元素),其中attrs规定了元素的属性来辅助定位操作:

8e900e5ab5c7486b9e1c9cfd8a00fc63.png

        得到输出如下,第一次定位成功!

8d5198a78ba347f7892fe1ac5dc16783.png

        接着我们就需要定位到ol下的每一个<li>,由于存在很多<li>都是我们所需要的,我们使用findAll函数,表示获取所有满足我们定位要求的元素:

7fa94d09c4304239aea5bf73baad8a7d.png

        得到输出如下,表明第二次定位成功!

148db6e5cbf2451e93e576bbfba2b376.png

        接下来就到了获取电影标题的环节,对于每一个<li>我们需要定位到<span class=”title”>,值得注意的是,每一个<li>对应的标题数量并不相同,但这并无大碍。

e64db75b1c964868a9da00ee5cb46492.png

63bf2528dfa84ce8ae2e5a67ae729ee5.png

        我们可以直接用find,爬取每个<li>下的第一个标题:

ed78055698dc49678a6e337b70b63538.png

        得到输出:

f502af97be5742f9903d99eceeb36998.png

        我们发现,我们所爬取的title实际上是整个元素,那么我们如何只截取其中的文本内容呢?很简单,只需要取film_title.text即可。(python真方便TAT)

c1a26524e195449aa9905f7350403e21.png

 

        但不要忘了我们实战的目标是什么。我们需要爬取的是豆瓣top250,这上面爬取的内容显然没有250个,那么我们只需要依次访问各个排行界面进行同样的爬取操作即可。我们来到榜单的第二页与第三页,发现网站的地址依次为:

https://movie.douban.com/top250?start=25&filter=

https://movie.douban.com/top250?start=50&filter=

bab6bbd8c18f41c48fa30c2086912df1.png

da6b6bd06daa40349c2ed2462d7d4266.png

        聪明如你一定发现了规律所在,那我们不妨把start=后面改为0,发现我们回到了熟悉的第一页。

a719cfa4ba254052a710788567371a95.png

        事实上,我们删掉末尾的&filter=,也可以访问相应的网页。

        那么事情就变得好办了,我们想要爬取top250,只需要写一个for循环来更新我们发送请求的target_url即可,https://movie.douban.com/top250?start=i,其中i取值为 range(0,250,25)

        具体代码实现如下:

240a140763c54968a13c82bdd75ff940.png

        不妨把获取到的数据存储到一个本地文档中:

1bde522b6bf441f2a72c2c72393aedaf.png

        检查文档,爬取成功!

e255b802d967429dbb57e9c32c1fb530.png

 

        至此,我们的爬虫入门讲解与实战训练就结束了,恭喜您成功入门爬虫,也感谢您的浏览!

        最后,附上源代码:

import requests # requests库用于向目标网站发送请求
from bs4 import BeautifulSoup # 用于解析HTML界面

film_cnt = 0

with open("films_top250.txt","w",encoding='utf-8') as films_w:
    for i in range(0,250,25):

        target_url = f"https://movie.douban.com/top250?start={i}"

        headers_ = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'}

        response_header = requests.get(target_url,headers=headers_)

        html_text = response_header.text

        html_soup = BeautifulSoup(html_text,"html.parser") # 把获取的网页源代码文本数据按html去解析

        films_ol = html_soup.find("ol",attrs={"class":"grid_view"})

        film_li_list = films_ol.findAll("li")

        for film_li in film_li_list:
            # print(film_li)
            film_title = film_li.find("span",attrs={"class":"title"})

            print(film_title.text)

            film_cnt += 1

            films_w.write(f"{film_cnt}.{film_title.text}\n")


 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python3网络爬虫开发实战(7)JavaScript 动态渲染页面爬取

文章目录 一、Selenium1. 基本安装2. 基本使用3. 声明浏览器对象4. 访问页面5. 查找节点6. 节点交互7. 动作链8. 执行 JavaScript9. 获取节点信息10. 切换 Frame11. 延时等待12. 前进后退13. Cookies14. 选项卡管理15. 异常处理16. 反屏蔽17. 无头模式18. Pyppeteer&#xff0c…

《遥远的救世主》读后感

未完待续。。。。 未完待续。。。。 未完待续。。。。 【经典语录】 01. 我们这个民族总是以有文化自居&#xff0c;却忘了问一句&#xff1a;是有什么文化&#xff1f;是真理真相的文化还是弱势文化&#xff1f;是符合事物规律的文化还是违背事物规律的文化&#xff1f;任何…

shell脚本与sed基本语法

Day11 一、shell 基础 1、shell 概念 shell 英文翻译过来是外壳的意思&#xff0c;作为计算机语言来理解可以认为它是 操作系统的外壳。可以通过shell 命令来操作和控制操作系统&#xff0c;比如 Linux中的shell命令就包括 ls、cd、pwd 等等。 2、shell 在内核的基础上编写的…

第一个设计模式——单例模式

目录 一、特点&#xff1a; 二、实现单例模式步骤 三、饿汉式 四、懒汉式 五、双重检查锁 六、静态内部类 七、枚举 八、可能被反序列化和反射破坏什么意思&#xff1f; 九、如何解决呢&#xff1f; 一、特点&#xff1a; 唯一性&#xff0c;单例模式确保程序中只有一…

甘肃粉条:一口爽滑,满心欢喜

在甘肃的美食世界里&#xff0c;粉条是一道独具特色的存在&#xff0c;它以其爽滑的口感和多样的烹饪方式&#xff0c;赢得了无数人的喜爱。甘肃食家巷粉条&#xff0c;选用当地优质的土豆或红薯为原料&#xff0c;经过一系列精细的加工工艺&#xff0c;最终成就了这一根根晶莹…

SSRF (服务端请求伪造)

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

2-48 基于matlab的EM算法聚类可视化程序

基于matlab的EM算法聚类可视化程序&#xff0c;通过期望最大化算法&#xff08;EM&#xff09;优化类别间距&#xff0c;使得类别间距最大、类内间距最小。输出聚类前后结果及收敛曲线。程序已调通&#xff0c;可直接运行。 2-48 期望最大化算法&#xff08;EM&#xff09; 聚类…

6/9-axis imu sensor/姿态传感器 学习板/开发板 开源 MPU6500 QMC5883 加速度 陀螺仪 地磁传感器

1-应用领域&#xff1a; 游戏交互、3D模型控制、机器人、设备姿态检测、翻转状态检测、无人机、无人船、无人车、VR/AR、AHRS、姿态算法研究与分析&#xff0c;短距无效姿态测量、车辆调平系统&#xff0c;机器震动检测 2-产品硬件规格: 尺寸: 蓝牙:5.0 电池:默认150ma&…

TCP程序设计

TCP概述 建立连接 客户端和服务器端在建立连接时&#xff1a; 服务端是典型的监听接受连接的模式&#xff0c;就是ListenAccept 客户端是主动建立连接的模式&#xff0c;就是Dial Go语言中使用 net包实现网络的相关操作&#xff0c;包括我们TCP的操作。 用于建立连接的典型…

tusiart吐司艺术图像生成、LoRA 模型的使用和训练网站

文章目录 前言一、Tusiart&#xff08;吐司艺术&#xff09;是什么二、Tusiart&#xff08;吐司艺术&#xff09;主要功能三、Tusiart&#xff08;吐司艺术&#xff09; 网站图片四、Tusiart&#xff08;吐司艺术&#xff09; 相关地址总结 前言 每天分享一个关于AI项目或者网…

【系统架构设计师】二十、云原生架构设计理论与实践①

目录 一、云原生架构内涵 二、云原生的原则 三、主要架构模式 四、典型的云原生架构反模式 相关推荐 一、云原生架构内涵 云原生架构是基于云原生技术的一组架构原则和设计模式的集合&#xff0c;旨在将云应用中的非业务代码部分进行最大化的剥离&#xff0c;从而让云设施…

SQL Server索引碎片的基本知识(附Demo)

目录 前言1. 基本知识2. 检索碎片2.1 dm_db_index_physical_stats2.2 DBCC SHOWCONTIG 3. 修复和优化 前言 索引碎片太高本身会阻碍查询的效率&#xff0c;这个问题要重视 1. 基本知识 索引中的数据页不再连续&#xff0c;导致存储和检索数据时的效率降低 碎片通常发生在以…

虚拟机启动电脑蓝屏问题解决方案

1.查看CPU虚拟化是否开启&#xff0c;没有开启的可以按照教程开启 打开任务管理器&#xff0c;查看是否开启CUP虚拟化 如果没有开启,可以查看下面的链接&#xff0c;进入BIOS开启 win10如何开启虚拟化支持_win10开启cpu虚拟化的方法&#xff0d;系统城 2&#xff0c;控制面板…

C#中的同步编程和异步编程

1. 简单描述一下同步编程和异步编程 同步编程&#xff1a;按照代码的顺序一行一行执行&#xff0c;如果某个操作需要等待&#xff08;比如读取文件、网络请求、数据库操作等&#xff09;&#xff0c;那么当前的线程就会停下来&#xff0c;一直到这个操作完成了之后&#xff0c…

无坚不摧的Python重试机制:探索Tenacity库

无坚不摧的Python重试机制&#xff1a;探索Tenacity 库 背景&#xff1a;为何选择Tenacity&#xff1f; 在软件开发中&#xff0c;我们经常面临需要重试操作的场景&#xff0c;比如网络请求、数据库操作等。这些操作可能会因为各种原因暂时失败&#xff0c;但稍后可能会成功…

更换CentOS Stream 8镜像源

CentOS Stream 8替换阿里云镜像源 确认CentOS版本 hostnamectl备份当前配置 sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.backup创建临时文件下载目录 mkdir -p /tmp/aliyun-repos cd /tmp/aliyun-repos下载 .repo 文件列表并解析链接 wget -r -np -nd -A ".repo&…

ssm框架整合,异常处理器和拦截器(纯注解开发)

目录 ssm框架整合 第一步&#xff1a;指定打包方式和导入所需要的依赖 打包方法&#xff1a;war springMVC所需依赖 解析json依赖 mybatis依赖 数据库驱动依赖 druid数据源依赖 junit依赖 第二步&#xff1a;导入tomcat插件 第三步&#xff1a;编写配置类 SpringCon…

C++知识点总结:2.类和对象(自用)

类和对象 1. 类和对象的关系2. 对象指针3. 在堆上创建对象4. 成员访问限定符5. 名字编码&#xff08;Name Mangling&#xff09;6.构造函数7.构造函数的重载8.初始化列表8. 成员变量初始化的顺序&#xff08;通过初始化列表&#xff09;9. 初始化 const 成员变量10. 析构函数11…

安装 moleculeSTM 踩坑日记

“学习 LLM &#xff0c;在大模型时代为自己存张船票”。 相信很多人都有这样的想法。那么&#xff0c;在 AI for science 领域&#xff0c;哪些 LLM 模型值得一试呢&#xff1f; 笔者认为&#xff1a; LLM 直接预测 SMILES 性质 or 直接生成 SMILES 的技术路线是行不通的。因…

成为git砖家(6): git restore 命令

文章目录 1. git restore 命令是新命令2. git官方对于restore命令的说明3. 总结 1. git restore 命令是新命令 在2019年8月发布的 Git 2.23 版本中&#xff0c;git checkout 命令的功能被拆解到两个新的命令中&#xff1a; git switch: 负责分支相关的操作git restore: 负责文…