Python3 爬虫 Scrapy的使用
安装完成Scrapy以后,可以使用Scrapy自带的命令来创建一个工程模板。
一、创建项目
使用Scrapy创建工程的命令为:
scrapy startproject <工程名>
例如,创建一个抓取百度的Scrapy项目,可以将命令写为:
scrapy startproject baidu
工程名可以使用英文字母和数字的组合,但是绝对不能使用“scrapy”(小写)作为工程名,否则爬虫无法运行。也不要使用任何已经安装的Python第三方库的名称作为工程名,否则可能会出现奇怪的错误。这是由于Python在导入库的时候,会优先从当前工程文件夹中寻找满足条件的文件或者文件夹,如果工程的名称本身就为scrapy,那么Python就无法找到正常的Scrapy库的文件。
创建完成工程以后,Scrapy有以下的提示:
you can start your first spider with:cd baidu scrapy genspider example example.com
这个提示的意思是说,可以通过下面的两条命令来创建第一个爬虫。根据它的说明来执行命令:
cd baiduscrapy genspider example baidu.com
在Scrapy genspider命令中,有两个参数,“example”和“baidu.com”。其中,第1个参数“example”是爬虫的名字,这个名字可以取英文和数字的组合,但是绝对不能为“scrapy”或者工程的名字。在现在这个例子中,爬虫的工程名为“baidu”,所以这里的第1个参数也不能为“baidu”。
第2个参数“baidu.com”是需要爬取的网址。开发工程师可以修改为任何需要爬取的网址。
需要注意的是,在这个例子中,“baidu.com”没有加“www”,这是因为在浏览器中直接输入“baidu.com”就可以打开百度的首页。如果有一些网址需要添加二级域名才能访问,那么这里也必须要把二级域名加上。例如:
scrapy genspider news news.163.com
现在已经把爬虫创建好了,在PyCharm中打开Scrapy的工程,可以看到在spiders文件夹下面有一个example.py 。
这个由Scrapy自动生成的爬虫运行以后是不会报错的,但是它不会输出有用的信息。
现在,将第11行:
pass
修改为:
print(response.body.decode())
修改完成以后,通过Windows或者Mac、Linux的终端进入爬虫的工程根目录,使用以下命令运行爬虫:
scrapy crawl <爬虫名>
这里,启动百度首页爬虫的命令为:
scrapy crawl example
需要特别强调的是,Scrapy的爬虫绝对不能通过Python直接运行example.py来运行。
上面的代码运行以后,可以看到并没有百度首页上面的任何文字出。
这是由于Scrapy的爬虫默认是遵守robots.txt协议的,而百度的首页在robots.txt协议中是禁止爬虫爬取的。
要让Scrapy不遵守robots.txt协议,需要修改一个配置。在爬虫的工程文件夹下面找到并打开settings.py文件,可以在里面找到下面的一行代码。
# Obey robots.txt rulesROBOTSTXT_OBEY = True
将True修改为False:
# Obey robots.txt rulesROBOTSTXT_OBEY = False
再一次运行爬虫,可以正常获取到百度的首页。
Scrapy的爬虫与普通的Python文件普通爬虫的不同之处在于,Scrapy的爬虫需要在CMD或者终端中输入命令来运行,不能直接运行spiders文件夹下面的爬虫文件。那么如何使用PyCharm来运行或者调试Scrapy的爬虫呢?为了实现这个目的,需要创建另外一个Python文件。文件名可以取任意合法的文件名。这里以“main.py”为例。
main.py文件内容如下:
from scrapy import cmdlinecmdline.execute("scrapy crawl example".split()
将main.py文件放在工程的根目录下,这样,PyCharm可以通过运行main.py来运行Scrapy的爬虫。
二、在Scrapy中使用XPath
由于可以从response.body.decode()中得到网页的源代码,那么就可以使用正则表达式从源代码里面提取出需要的信息。但是如果可以使用XPath,则效率将会大大提高。好消息是,Scrapy完全支持XPath。
1. ScrapyXPath语法说明
Scrapy与lxml使用XPath的唯一不同之处在于,Scrapy的XPath语句后面需要用.extract()这个方法。
“extract”这个单词在英语中有“提取”的意思,所以这个.extract()方法的作用正是把获取到的字符串“提取”出来。在Scrapy中,如果不使用.extract()方法,那么XPath获得的结果是保存在一个SelectorList中的,直到调用了.extract()方法,才会将结果以列表的形式生成出来。
这个SelectorList非常有意思,它本身很像一个列表。可以直接使用下标读取里面的每一个元素,也可以像列表一样使用for循环展开,然后对每一个元素使用.extract()方法。同时,又可以先执行SelectorList的.extract()方法,得到的结果是一个列表,接下来既可以用下标来获取每一个元素,也可以使用for循环展开。
2. Scrapy的工程结构
scrapy.cfgtutorial/__init__.pyitems.pypipelines.pysettings.pyspiders/__init__.py...
其中对于开发Scrapy爬虫来说,需要关心的内容如下。
(1)spiders文件夹:存放爬虫文件的文件夹。
(2)items.py:定义需要抓取的数据。
(3)pipelines.py:负责数据抓取以后的处理工作。
(4)settings.py:爬虫的各种配置信息。
在有spiders和settings.py这两项的情况下,就已经可以写出爬虫并保存数据了。
但是为什么还有items.py和pipelines.py这两个文件呢?这是由于Scrapy的理念是将数据爬取和数据处理分开。
items.py文件用于定义需要爬取哪些内容。每个内容都是一个Field。
pipelines.py文件用于对数据做初步的处理,包括但不限于初步清洗数据、存储数据等。
--------------------------------------
没有自由的秩序和没有秩序的自由,同样具有破坏性。
相关文章:

Python3 爬虫 Scrapy的使用
安装完成Scrapy以后,可以使用Scrapy自带的命令来创建一个工程模板。 一、创建项目 使用Scrapy创建工程的命令为: scrapy startproject <工程名> 例如,创建一个抓取百度的Scrapy项目,可以将命令写为: scrapy s…...

多线程篇-4--重点概念1(volatile,Synchronized,内存屏障,MESI协议)
一、volatile (1)、简述 volatile是java提供的一个关键字,英文意思为不稳定的。 可以保障被声明对象的可见性和一定程度上的有序性,但不能保证操作的原子性。 当一个变量被声明为volatile时,意味着该变量的值会直接从…...

本地学习axios源码-如何在本地打印axios里面的信息
1. 下载axios到本地 git clone https://github.com/axios/axios.git 2. 下载react项目, 用vite按照提示命令配置一下vite react ts项目 npm create vite my-vue-app --template react 3. 下载koa, 搭建一个axios请求地址的服务端 a.初始化package.json mkdir koa-server…...
1、SpringBoo中Mybatis多数据源动态切换
我们以一个实例来详细说明一下如何在SpringBoot中动态切换MyBatis的数据源。 一、需求 1、用户可以界面新增数据源相关信息,提交后,保存到数据库 2、保存后的数据源需要动态生效,并且可以由用户动态切换选择使用哪个数据源 3、数据库保存了多个数据源的相关记录后,要求…...
【浏览器】缓存与存储
我是目录 浏览器缓存为什么需要浏览器缓存?对浏览器的缓存机制的理解协商缓存和强缓存的区别强缓存协商缓存 点击刷新按钮或者按 F5、按 CtrlF5 (强制刷新)、地址栏回车有什么区别? 浏览器本地存储前端储存的方式有哪些࿱…...

积鼎科技携手西北工业大学动力与能源学院共建复杂多相流仿真联合实验室
11月26日,复杂多相流仿真联合实验室揭牌仪式及技术研讨活动在西北工业大学动力与能源学院成功举办。复杂多相流仿真联合实验室是由西北工业大学动力与能源学院牵头,携手上海积鼎信息科技有限公司与三航铸剑(西安)科技发展有限公司…...

5. langgraph实现高级RAG (Adaptive RAG)
1. 数据准备 from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import WebBaseLoader from langchain_community.vectorstores import Chromaurls ["https://lilianweng.github.io/posts/2023-06-23-age…...

Postman设置接口关联,实现参数化
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果, 从而让后一个接口能正常执行,这…...

代码随想录day02--链表
移除链表元素 题目 地址:https://leetcode.cn/problems/remove-linked-list-elements/description/ 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 思路是使用虚拟节点的…...

杰发科技AC7803——不同晶振频率时钟的配置
计算公式 PLL_POSDIV [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62] PLL_PREDIV_1 1 2 4 USE_XTAL 24M SYSCLK_FREQ 64M SYSCLK_DIVIDER 1 VCO USE_XTAL*…...

ArcGIS栅格影像裁剪工具
1、前言 在最近的栅格转矢量处理过程中,发现二值化栅格规模太大,3601*3601,并且其中的面元太过细碎,通过arcgis直接栅格转面有将近几十万的要素,拿这样的栅格数据直接运行代码,发现速度很慢还难以执行出来结…...

【查询目录】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
docker快速安装zookeeper
一、拉取镜像 docker pull zookeeper:3.9.3 二、启动zookeeper docker run --restartalways -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime zookeeper:3.9.3 如果需要挂载zookeeper文件及目录,则参数增加: -v /mydata/zookeeper/d…...
MySQL中如何减少回表
在MySQL中,回表是指在使用非聚集索引进行查询时,如果需要获取的数据不在索引页中,就需要根据索引页中的指针返回到数据表中查找实际数据行的过程。这个过程会增加额外的磁盘I/O操作,降低查询性能,特别是在查询大量数据…...

初始Python篇(7)—— 正则表达式
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: Python 目录 正则表达式的概念 正则表达式的组成 元字符 限定符 其他字符 正则表达式的使用 正则表达式的常见操作方法 match方法的…...
洛谷P1443 马的遍历
简单的bfs 题目链接 P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 有一个 nm 的棋盘,在某个点(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。 输入格式 输入只有一行四个整数,分别为 n…...

代理IP地址的含义与设置指南
在数字化时代,互联网已经成为我们日常生活不可或缺的一部分。然而,在享受互联网带来的便利的同时,我们也面临着隐私泄露、访问限制等问题。代理IP地址作为一种有效的网络工具,能够帮助我们解决这些问题。本文将详细介绍代理IP地址…...
Vue--------导航守卫(全局,组件,路由独享)
全局导航守卫 beforeEach 全局前置守卫 afterEach 全局后置守卫 路由独享守卫 beforeEnter 路由独享守卫 组件导航守卫 beforeRouteEnter 进入组件前 beforeRouteUpdate 路由改变但是组件复调用 beforeRouteLeave 离开组件之前 执行顺…...

ElasticSearch7.x入门教程之全文搜索(七)
文章目录 前言一、多条件查询:bool query二、更加精准查询:dis_max query总结 前言 这里再接着上一篇文章继续记录。非常感谢江南一点雨松哥的文章。 欢迎大家去查看,地址:http://www.javaboy.org 一、多条件查询:boo…...

Adversarial Learning forSemi-Supervised Semantic Segmentation
首先来了解一下对抗学习: 对抗样本:将真实的样本添加扰动而合成的新样本,是由深度神经网络的输入的数据和人工精心设计好的噪声合成得到的,但它不会被人类视觉系统识别错误。然而在对抗数据面前,深度神经网络却是脆弱…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...