当前位置: 首页 > news >正文

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以后&#xff0c;可以使用Scrapy自带的命令来创建一个工程模板。 一、创建项目 使用Scrapy创建工程的命令为&#xff1a; scrapy startproject <工程名> 例如&#xff0c;创建一个抓取百度的Scrapy项目&#xff0c;可以将命令写为&#xff1a; scrapy s…...

多线程篇-4--重点概念1(volatile,Synchronized,内存屏障,MESI协议)

一、volatile &#xff08;1&#xff09;、简述 volatile是java提供的一个关键字&#xff0c;英文意思为不稳定的。 可以保障被声明对象的可见性和一定程度上的有序性&#xff0c;但不能保证操作的原子性。 当一个变量被声明为volatile时&#xff0c;意味着该变量的值会直接从…...

本地学习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、数据库保存了多个数据源的相关记录后,要求…...

【浏览器】缓存与存储

我是目录 浏览器缓存为什么需要浏览器缓存&#xff1f;对浏览器的缓存机制的理解协商缓存和强缓存的区别强缓存协商缓存 点击刷新按钮或者按 F5、按 CtrlF5 &#xff08;强制刷新&#xff09;、地址栏回车有什么区别&#xff1f; 浏览器本地存储前端储存的方式有哪些&#xff1…...

积鼎科技携手西北工业大学动力与能源学院共建复杂多相流仿真联合实验室

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

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设置接口关联,实现参数化

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

代码随想录day02--链表

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

杰发科技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、前言 在最近的栅格转矢量处理过程中&#xff0c;发现二值化栅格规模太大&#xff0c;3601*3601&#xff0c;并且其中的面元太过细碎&#xff0c;通过arcgis直接栅格转面有将近几十万的要素&#xff0c;拿这样的栅格数据直接运行代码&#xff0c;发现速度很慢还难以执行出来结…...

【查询目录】.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文件及目录&#xff0c;则参数增加&#xff1a; -v /mydata/zookeeper/d…...

MySQL中如何减少回表

在MySQL中&#xff0c;回表是指在使用非聚集索引进行查询时&#xff0c;如果需要获取的数据不在索引页中&#xff0c;就需要根据索引页中的指针返回到数据表中查找实际数据行的过程。这个过程会增加额外的磁盘I/O操作&#xff0c;降低查询性能&#xff0c;特别是在查询大量数据…...

初始Python篇(7)—— 正则表达式

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 正则表达式的概念 正则表达式的组成 元字符 限定符 其他字符 正则表达式的使用 正则表达式的常见操作方法 match方法的…...

洛谷P1443 马的遍历

简单的bfs 题目链接 P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 有一个 nm 的棋盘&#xff0c;在某个点(x,y) 上有一个马&#xff0c;要求你计算出马到达棋盘上任意一个点最少要走几步。 输入格式 输入只有一行四个整数&#xff0c;分别为 n…...

代理IP地址的含义与设置指南‌

在数字化时代&#xff0c;互联网已经成为我们日常生活不可或缺的一部分。然而&#xff0c;在享受互联网带来的便利的同时&#xff0c;我们也面临着隐私泄露、访问限制等问题。代理IP地址作为一种有效的网络工具&#xff0c;能够帮助我们解决这些问题。本文将详细介绍代理IP地址…...

Vue--------导航守卫(全局,组件,路由独享)

全局导航守卫 beforeEach 全局前置守卫 afterEach 全局后置守卫 路由独享守卫 beforeEnter 路由独享守卫 组件导航守卫 beforeRouteEnter 进入组件前 beforeRouteUpdate 路由改变但是组件复调用 beforeRouteLeave 离开组件之前 执行顺…...

ElasticSearch7.x入门教程之全文搜索(七)

文章目录 前言一、多条件查询&#xff1a;bool query二、更加精准查询&#xff1a;dis_max query总结 前言 这里再接着上一篇文章继续记录。非常感谢江南一点雨松哥的文章。 欢迎大家去查看&#xff0c;地址&#xff1a;http://www.javaboy.org 一、多条件查询&#xff1a;boo…...

Adversarial Learning forSemi-Supervised Semantic Segmentation

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

UCOS-II 自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 一、UC/OS_II体系结构 二、UC/OS_II中的任务 1、任务的基本概念 在UCOS-II中&#xff0c;通常把一个大型任…...

C++ - 二叉搜索树讲解

二叉搜索树概念和定义 二叉搜索树是一个二叉树&#xff0c;其中每个节点的值都满足以下条件&#xff1a; 节点的左子树只包含小于当前节点值的节点。节点的右子树只包含大于当前节点值的节点。左右子树也必须是二叉搜索树。 二叉树搜索树性质 从上面的二叉搜索树定义中可以了…...

基于开源云原生数据仓库 ByConity 体验多种数据分析场景

基于开源云原生数据仓库 ByConity 体验多种数据分析场景 业务背景什么是 ByConity上手实测环境要求测试操作远程登录 ECS 服务器windows10 自带连接工具 执行查询 ByConity 相对于 ELT 能力的优化提升并行度任务级重试并行写入简化数据链路 业务背景 大家都知道&#xff0c;在…...

RabbitMQ 消息确认机制

RabbitMQ 消息确认机制 本文总结了RabbitMQ消息发送过程中的一些代码片段&#xff0c;详细分析了回调函数和发布确认机制的实现&#xff0c;以提高消息传递的可靠性。 返回回调机制的代码分析 主要用途 这个代码主要用于设置RabbitMQ消息发送过程中的回调函数&#xff0c;即…...

Node.js:开发和生产之间的区别

Node.js 中的开发和生产没有区别&#xff0c;即&#xff0c;你无需应用任何特定设置即可使 Node.js 在生产配置中工作。但是&#xff0c;npm 注册表中的一些库会识别使用 NODE_ENV 变量并将其默认为 development 设置。始终在设置了 NODE_ENVproduction 的情况下运行 Node.js。…...

【QT】背景,安装和介绍

TOC 目录 背景 GUI技术 QT的安装 使用流程 QT程序介绍 main.cpp​编辑 Wiget.h Widget.cpp form file .pro文件 临时文件 C作为一门比较古老的语言&#xff0c;在人们的认知里始终是以底层&#xff0c;复杂和高性能著称&#xff0c;所以在很多高性能需求的场景之下…...

从0到1搭建webpack

好&#xff0c;上一篇文章我们说了一下在react中怎么弄这个webpack&#xff0c;那么现在在说一下不用react我们又该怎么配置&#xff0c;这些呢也都是我自己通弄过看视频自己总结的&#xff0c;拿来给大家分享一下。 前期准备条件 1、nvm&#xff08;可以快速切换node版本&am…...

针对解决conda环境BUG的个人笔记

1-conda学习&安装 安装视频&#xff1a; 零基础教程&#xff1a;基于Anaconda和PyCharm配置Pytorch环境_哔哩哔哩_bilibili 安装过程&#xff1a; MX250笔记本安装Pytorch、CUDA和cuDNN-CSDN博客 Win10MX250CUDA10.1cuDNNPytorch1.4安装测试全过程(吐血)_nvidia geforc…...

读《Effective Java》笔记 - 条目13

条目13&#xff1a;谨慎重写clone方法 浅拷贝和深拷贝 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝 只复制对象本身&#xff0c;而不复制对象引用的成员。 对于引用类型的字段&#xff0c;浅拷贝会将原对象的引用复制到新对象中&#xff0c;而不会创建新对象实例。因…...

SQL 之连接查询

SQL 连接查询&#xff1a;深入理解 JOIN 操作 在数据库管理中&#xff0c;连接查询&#xff08;JOIN&#xff09;是一种基本而强大的操作&#xff0c;它允许我们从两个或多个表中检索数据。SQL 中的 JOIN 操作使得数据整合变得简单&#xff0c;这对于数据分析和报告至关重要。…...

什么程序做网站安全/合肥网络关键词排名

dhcp 端口 UDP67和UDP68为正常的DHCP服务端口 rpm -qa | grep dhcp 查询是否安装了dhcp 服务 安装dhcp 服务 yum install dhcp -y 打开/etc/dhcp/dhcpd.conf subnet 192.168.105.0 netmask 255.255.255.0 { 下发网段 range 192.168.105.20 192.168.105.200 ; …...

三部曲网站建设/佛山seo优化外包

Microsoft Windows恶意软件删除工具可以检查运行 Windows XP、Windows 2000 和 Windows Server 2003 的计算机是否受到特殊、流行的恶意软件(包括 Blaster、Sasser 和 Mydoom)的感染&#xff0c;并帮助您删除所有找到的感染病毒。 当检测和删除过程完成时&#xff0c;此工具将显…...

发布程序后网站有很多/软文营销的定义

目录 LOW&#xff1a; Medium&#xff1a; High Impossible LOW&#xff1a; 源代码&#xff1a; <?php // The page we wish to display $file $_GET[ page ]; ?> 可以看到&#xff0c;low级别的代码对包含的文件没有进行任何的过滤&#xff01;这导致我们可…...

二级网站建设/廊坊关键词优化报价

1.函数的参数&#xff0c;动态传参 2.名称空间&#xff0c;局部名称空间&#xff0c;全局名称空间&#xff0c;作用域&#xff0c;加载顺序 3.函数的嵌套 4.gloabl&#xff0c;nonlcoal关键字 一 函数的动态传参&#xff0c;一个函数如果有多个参数就要写很多形参什么的&#x…...

推广网站怎样做/app开发多少钱

图像梯度与轮廓Sobel算子Scharr算子laplacian算子Canny边缘检测图像金字塔图像轮廓傅里叶变换滤波Sobel算子 如果出现负数则默认为0 img cv2.imread(data/pie.png,cv2.IMREAD_GRAYSCALE) cv2.imshow("img",img) cv2.waitKey() cv2.destroyAllWindows()dst cv2.Sob…...

房山 网站建设/短视频剪辑培训班速成

留存折损—–两个不同节点的留存之间的比值&#xff0c;用于判断留下用户的留存情况&#xff0c;即真实用户的留存。 换一种维度去分析留存&#xff0c;不拘泥于留存的绝对值&#xff0c;将留存统一化&#xff0c;提炼客观的参考标准。 常见的留存疑惑&#xff1a;** 我的游…...