【Python网络爬虫入门教程3】成为“Spider Man”的第三课:从requests到scrapy、爬取目标网站

Python 网络爬虫入门:Spider man的第三课

  • 写在最前面
    • 从requests到scrapy
    • 利用scrapy爬取目标网站
    • 更多内容
  • 结语

写在最前面

有位粉丝希望学习网络爬虫的实战技巧,想尝试搭建自己的爬虫环境,从网上抓取数据。

前面有写一篇博客分享,但是内容感觉太浅显了
【一个超简单的爬虫demo】探索新浪网:使用 Python 爬虫获取动态网页数据

本期邀请了擅长爬虫的朋友@PoloWitty,来撰写这篇博客。通过他的专业视角和实战经验,一步步引导我们入门,成为一名数据探索的“Spider Man”。

【Python网络爬虫入门教程1】成为“Spider Man”的第一课:HTML、Request库、Beautiful Soup库
【Python网络爬虫入门教程2】成为“Spider Man”的第二课:观察目标网站、代码编写
【Python网络爬虫入门教程3】成为“Spider Man”的第三课:从requests到scrapy、爬取目标网站


随着互联网数据的指数级增长,了解如何有效地提取这些信息变得越来越重要。无论是文本模型如ChatGPT,还是视觉模型如Stable Diffusion,它们的训练数据大多来源于互联网的海量数据。在这个日新月异的大数据时代,爬虫也算是其中不得不点的一项基础技能树了。

本系列文章将深入浅出地介绍Python网络爬虫的基础知识和技术,从 Requests 库到 Scrapy 框架的 入门级 使用,为你开启python网络爬虫的大门,成为spider man的一员,并最终以ScrapeMe网站作为目标示例,爬取下网站上的可爱又有趣的宝可梦照片。

在开始之前,还要啰嗦几句叠个甲,网络爬虫虽然强大,但在使用时必须遵守法律法规和网站的爬虫协议。不违法爬取数据,遵守相关法律法规哦~

请添加图片描述

这是本系列的第三篇文章,将会以ScrapeMe网站作为示例,展示如何利用scrapy库更好的来对网站上的宝可梦图片进行爬取。

文章目录

  • 写在最前面
    • 从requests到scrapy
    • 利用scrapy爬取目标网站
    • 更多内容
  • 结语

从requests到scrapy

当谈到网络爬虫时,起初我们可能会选择简单的方案,比如使用requestsBeautiful Soup这样的工具,就像手工艺者用胶水和剪刀来完成手工艺品。但是,当我们的爬虫任务变得更为复杂、庞大时,我们就需要更高效、更强大的工具。

这时候,Scrapy登场了!它就像是一台全能机器人助手,能够应对各种爬虫任务。通过Scrapy,我们可以创建整个爬虫项目,定义抓取规则和流程。它能够并行抓取多个页面,就像是多线程的大明星!更棒的是,它内置了各种功能,比如自动的请求调度、页面解析以及数据存储。简直就像是一套量身定制的工具箱,让我们更轻松地面对爬虫世界的挑战。

具体到我们在第二课中实现的简单爬虫程序,运行过程序的小伙伴可能会发现,爬取的速度并不是很快,而如果要自己实现并行,不仅需要了解并行的相关知识,还要做好并行程序之间的通讯调度等等。而Scrapy框架则可以直接帮我们自动完成这些功能,我们仅需要关注于单个线程代码的实现即可,是不是很方便呢

利用scrapy爬取目标网站

首先,我们需要利用pip install Scrapy命令下载Scrapy包。

为了创建一个完整的scrapy项目,我们可以使用其提供的命令行工具进行创建,在命令行中输入scrapy startproject spider,我们可以新建一个名为spider的全新scrapy项目,在这个项目目录下,包含以下一些文件:

.
├── scrapy.cfg
└── spider├── __init__.py ├── items.py ├── middlewares.py├── pipelines.py├── settings.py # 项目配置文件└── spiders 	# 用于放置你的爬虫程序的目录└── __init__.py

除了上述给出注释的文件,其他文件里的内容可以暂时不进行理会,感兴趣的同学可以在网上查找相关内容进行学习。

然后我们进入spider/spiders目录下,在命令行中输入scrapy genspider pokemon scrapeme.live/shop/ ,创建一个名为pockmon的爬虫(一个爬虫项目下可以又多个爬虫),用于爬取scrapme.live/shop/网页。

此时,在spider/spiders目录下,我们便可以发现我们的爬虫程序pokemon.py,它当前的内容为自动填充的结果:

import scrapyclass PokemonSpider(scrapy.Spider):name = "pokemon"allowed_domains = ["scrapeme.live"]start_urls = ["http://scrapeme.live/"]def parse(self, response):pass

接下来我们需要向其中填入新的内容,并可以使用scrapy crawl pokemon -O image_urls.csv命令运行该爬虫,得到我们想要的结果:

import scrapy
import requestsdef download_from_url(url:str):'''利用requests库,从相应的图片链接中下载对应的图片结果会保存到results文件夹中'''filename = url.split('/')[-1]with open(f'../results/{filename}','wb') as fp:fig_response = requests.get(url)fp.write(fig_response.content)class PokemonSpider(scrapy.Spider):name = "pokemon"allowed_domains = ["scrapeme.live"]start_urls = [f"https://scrapeme.live/shop/page/{pageNum}/?orderby=popularity" for pageNum in range(1,49)] # 所有的page链接def parse(self, response):image_urls = response.css('img') # 找到所有的img对应的位置for image_url in image_urls:url = image_url.attrib['src']download_from_url(url)yield {'image_url':url}

其中PokemonSpider继承了scrapy.Spider类,会使用name属性命名该爬虫,并将请求限制在allowed_domains内,以start_urls开始进行爬取。在parse()函数中,会得到一个response对象,这个对象其实就很类似于之前使用Beautiful Soup解析后的DOM树,我们可以直接使用repoonse.css()方法获取到网页中以相应css标签进行标记的内容,最后的yield会将每次parse的图像链接保存至image_urls.csv输出文件中。而相应的下载的图片依旧是在results文件夹下。

而想要使用scrapy让爬虫爬取速度更快,加大并发量,只需要在setting.py中新加入一行CONCURRENT_REQUESTS = 256即可hhh,是不是so easy呢

更多内容

Scrapy本身还有非常非常多的可拓展空间,当前成熟的爬虫程序中有很多便是使用scrapy进行编写的。而本课程作为入门课程,基本也就要到此为止了,如果还想学习更多关于scrapy的相关知识,可以阅读Scrapy Tutorial或者是网上的其他进阶课程。

结语

我们已经一起初步探索了网络爬虫的精彩世界,我们从HTML背景知识的介绍开始,深入理解了requestsBeautiful Soup这两个强大的工具。然后,我们在第二篇中利用这些知识和工具,成功爬取了一个网站上所有宝可梦的图片,获得了丰富的数据。

而第三篇则让我们迈入了更高级的领域,学习了如何使用Scrapy库来处理更大规模的爬虫任务。Scrapy让我们更高效、更自动化地抓取了目标网站的宝可梦图片,为我们的爬虫之旅增添了更多神奇的色彩,并为之后更复杂的任务打下坚实的基础。

通过这三篇课程,我们不仅仅学到了技术知识,更领略到了爬虫世界的广阔无垠。爬虫不仅是获取数据的手段,更是对互联网深度探索的一种方式。希望这些课程能为你的学习之路增添一些乐趣,并为你今后在数据获取和应用的旅程中提供帮助。愿你在这片广阔的数据海洋中畅游自如,发现更多精彩!

了爬虫世界的广阔无垠。爬虫不仅是获取数据的手段,更是对互联网深度探索的一种方式。希望这些课程能为你的学习之路增添一些乐趣,并为你今后在数据获取和应用的旅程中提供帮助。愿你在这片广阔的数据海洋中畅游自如,发现更多精彩!

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

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

相关文章

【实用技巧】从文件夹内批量筛选指定文件并将其复制到目标文件夹

原创文章,转载请注明出处! 从文件夹中批量提取指定文件。 使用DOS命令,根据TXT文件中列出指定文件名,批量实现查找指定文件夹里的文件并复制到新的文件夹。 文中给出使用DOS命令和建立批处理文件两种方法。 文件准备 工作文件…

vite(一)——基本了解和依赖预构建

文章目录 一、什么是构建工具?1.为什么使用构建工具?2.构建工具的作用?3.构建工具怎么用? 二、经典面试题:webpack和vite的区别1.编译方式不同2.基础概念不同3.开发效率不同4.扩展性不同5.应用场景不同6.总结&#xff…

QT- QT-lximagerEidtor图片编辑器

QT- QT-lximagerEidtor图片编辑器 一、演示效果二、关键程序三、下载链接 功能如下: 1、缩放、旋转、翻转和调整图像大小 2、幻灯片 3、缩略图栏(左、上或下);不同的缩略图大小 4、Exif数据栏 5、内联图像重命名 6、自定义快捷方式…

Vue3安装使用Mock.js--解决跨域

首先使用axios发送请求到模拟服务器上,再将mock.js模拟服务器数据返回给客户端。打包工具使用的是vite。 1.安装 npm i axios -S npm i mockjs --save-dev npm i vite-plugin-mock --save-dev 2.在vite.config.js文件中配置vite-plugin-mock等消息 import { viteMo…

mysql中NULL值

mysql中NULL值表示“没有值”,它跟空字符串""是不同的 例如,执行下面两个插入记录的语句: insert into test_table (description) values (null); insert into test_table (description) values ();执行以后,查看表的…

harmonyOS鸿蒙内核概述

内核概述 内核简介 用户最常见到并与之交互的操作系统界面,其实只是操作系统最外面的一层。操作系统最重要的任务,包括管理硬件设备,分配系统资源等,我们称之为操作系统内在最重要的核心功能。而实现这些核心功能的操作系统模块…

【经验分享】gemini-pro和gemini-pro-vision使用体验

Gemini Gemini已经对开发者开放了Gemini Pro的使用权限,目前对大家都是免费的,每分钟限制60条,至少这比起CloseAI的每个账户5刀限速1min3条要香的多,目前已于第一时间进行了体验 一句话总结,google很大方,但…

【Spring】@SpringBootApplication注解解析

前言: 当我们第一次创建一个springboot工程时,我们会对启动类(xxxApplication)有许多困惑,为什么只要运行启动类我们在项目中自定义的bean无需配置类配置,扫描就能自动注入到IOC容器中?为什么我…

仿牛客论坛的一些细节改进

私信列表的会话头像链接到个人主页 原来的不足 点击私信列表的会话头像应该要能跳转到该目标对象的个人主页。 原来的代码&#xff1a; <a href"profile.html"><img th:src"${map.target.headerUrl}" class"mr-4 rounded-circle user-he…

三、Java运算符

1.运算符和表达式 运算符&#xff1a; ​ 就是对常量或者变量进行操作的符号。 ​ 比如&#xff1a; - * / 表达式&#xff1a; ​ 用运算符把常量或者变量连接起来的&#xff0c;符合Java语法的式子就是表达式。 ​ 比如&#xff1a;a b 这个整体就是表达式。 ​ 而其…

数据分析为何要学统计学(4)——何为置信区间?它有什么作用?

置信区间是统计学中的一个重要工具&#xff0c;是用样本参数()估计出来的总体均值在某置信水平下的范围。通俗一点讲&#xff0c;如果置信度为95%&#xff08;等价于显著水平a0.05&#xff09;&#xff0c;置信区间为[a,b]&#xff0c;这就意味着总体均值落入该区间的概率为95%…

2036开关门,1109开关门

一&#xff1a;2036开关门 1.1题目 1.2思路 1.每次都是房间号是服务员的倍数的时候做处理&#xff0c;所以外层&#xff08;i&#xff09;枚举服务员1~n&#xff0c;内层&#xff08;j&#xff09;枚举房间号1~n&#xff0c;当j % i0时&#xff0c;做处理 2.这个处理指的是&…

小项目:迷宫

目录 引言1.题目描述及思想2.代码实现3.最终结果 引言 这个迷宫的话就是去年这时候&#xff0c;我记得当时讲这个的时候我还是一脸懵逼&#xff0c;就是事后花时间能够看懂&#xff0c;能够理解&#xff0c;但是自己肯定是不能够实现的&#xff0c;而且觉得这个东西非常的庞大…

【LeetCode刷题笔记(4)】【Python】【移动零】【简单】

文章目录 题目描述示例 1示例 2提示 解决方案题意拆解双指针算法双指针法的主要优点双指针法的使用场景举例&#xff1a; 解决方案&#xff1a;【双指针一次遍历】解题心得方案代码运行结果复杂度分析 结束语 移动零 题目描述 给定一个数组 nums&#xff0c;编写一个函数将所…

代码随想录第三十一天(一刷C语言)|无重叠区间划分字母区间合并区间

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、无重叠区间 思路&#xff1a;参考carl文档 按照右边界排序&#xff0c;从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。 ledcode题目&a…

多线程------ThreadLocal详解

目录 1. 什么是 ThreadLocal&#xff1f; 2. 如何使用 ThreadLocal&#xff1f; 3. ThreadLocal 的作用 4. ThreadLocal 的应用场景 5. ThreadLocal 的注意事项 我的其他博客 ThreadLocal 是 Java 中一个很有用的类&#xff0c;它提供了线程局部变量的支持。线程局部变量…

家政服务小程序预约上门,让服务更便捷

随着人们生活节奏的加快&#xff0c;家政服务行业越来越受到人们的欢迎。为了满足市场需求&#xff0c;提高服务质量&#xff0c;家政公司需要开发一款预约上门的家政服务小程序。本文将详细介绍如何制作一个预约上门的家政服务小程序。 一、登录乔拓云网后台 首先&#xff0c…

模块二——滑动窗口:438.找到字符串中所有字母异位词

文章目录 题目描述算法原理滑动窗口哈希表 代码实现 题目描述 题目链接&#xff1a;438.找到字符串中所有字母异位词 算法原理 滑动窗口哈希表 因为字符串p的异位词的⻓度⼀定与字符串p 的⻓度相同&#xff0c;所以我们可以在字符串s 中构造⼀个⻓度为与字符串p的⻓度相同…

【Stm32-F407】Keil uVision5 下新建工程

①双击鼠标左键打开Keil uVision5&#xff0c;选择 Project 下的 New uVision Project &#xff1b; ②在期望的文件夹下创建一个工程&#xff0c;并按如下要求操作&#xff1b; ③添加文件类型&#xff0c;按如下要求操作 ④如有需要可添加相关启动文件在工程文件夹下并添加到…

深度学习中的高斯分布

1 高斯分布数学表达 1.1 什么是高斯分布 高斯分布(Gaussian Distribution)又称正态分布(Normal Distribution)。高斯分布是一种重要的模型&#xff0c;其广泛应用与连续型随机变量的分布中&#xff0c;在数据分析领域中高斯分布占有重要地位。高斯分布是一个非常常见的连续概…