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

Scrapy入门学习

文章目录

  • Scrapy
    • 一. Scrapy简介
    • 二. Scrapy的安装
      • 1. 进入项目所在目录
      • 2. 安装软件包Scrapy
      • 3. 验证是否安装成功
    • 三. Scrapy的基础使用
      • 1. 创建项目
      • 2. 在tutorial/spiders目录下创建保存爬虫代码的项目文件
      • 3.运行爬虫
      • 4.利用css选择器+Scrapy Shell提取数据
        • 例如:

Scrapy

一. Scrapy简介

Scrapy是一个用于抓取网站和提取结构化数据的应用程序框架,可用于各种有用的应用程序,如数据挖掘、信息处理或历史存档。

尽管 Scrapy 最初是为网络抓取设计的,但它也可以用于使用 API(如Amazon Associates Web Services)提取数据,或用作通用网络爬虫。

其支持:

  1. 使用扩展 CSS 选择器和 XPath 表达式,以及使用正则表达式进行提取的帮助器方法,内置支持从 HTML/XML 源中选择和提取数据。

  2. 一个交互式外壳控制台(IPython 识别),用于尝试 CSS 和 XPath 表达式以抓取数据,在编写或调试爬虫时非常有用。

  3. 内置支持生成信息导出,格式多样(JSON、CSV、XML),并将其存储在多个后端(FTP、S3、本地文件系统)中。

  4. 强大的编码支持和自动检测,用于处理外来、非标准和损坏的编码声明。

  5. 强大的可扩展性支持,允许您使用信号和明确定义的 API(中间件、扩展和管道)插入您自己的功能。

  6. 用于处理的内置扩展和中间件范围广泛

    1. cookie 和会话处理

    2. HTTP 功能,如压缩、身份验证、缓存

    3. 用户代理欺骗

    4. robots.txt

    5. 抓取深度限制

    6. 以及更多

  7. 一个Telnet 控制台,用于连接到 Scrapy 进程中运行的 Python 控制台,以自省和调试您的爬虫

以及其他好处,例如可重复使用的爬虫,用于从站点地图和 XML/CSV 信息中抓取站点,用于自动下载图像(或任何其他媒体)的媒体管道与抓取的项目相关联,一个缓存 DNS 解析器,以及更多!

二. Scrapy的安装

建议在专用虚拟环境 中安装(如 AnacondaMiniconda), 以避免安装时与系统发生冲突。

1. 进入项目所在目录

在文件路径处输入cmd进入命令提示符

2. 安装软件包Scrapy

pip install Scrapy

3. 验证是否安装成功

进入激活后的虚拟环境对应项目目录,输入:

scrapy version

若出现对应scrapy版本号,即说明安装成功

三. Scrapy的基础使用

1. 创建项目

在开始爬取之前,您必须设置一个新的 Scrapy 项目。进入您想要存储代码的目录并运行

scrapy startproject tutorial

这将创建一个 tutorial 目录,其中包含以下内容

tutorial/scrapy.cfg            # deploy configuration filetutorial/             # project's Python module, you'll import your code from here__init__.pyitems.py          # project items definition filemiddlewares.py    # project middlewares filepipelines.py      # project pipelines filesettings.py       # project settings filespiders/          # a directory where you'll later put your spiders__init__.py

2. 在tutorial/spiders目录下创建保存爬虫代码的项目文件

这里保存为quotes_spider.py

from pathlib import Pathimport scrapyclass QuotesSpider(scrapy.Spider):name = "quotes"def start_requests(self):urls = ["https://quotes.toscrape.com/page/1/","https://quotes.toscrape.com/page/2/",]for url in urls:yield scrapy.Request(url=url, callback=self.parse)def parse(self, response):page = response.url.split("/")[-2]filename = f"quotes-{page}.html"Path(filename).write_bytes(response.body)self.log(f"Saved file {filename}")

其中

    def start_requests(self):urls = ["https://quotes.toscrape.com/page/1/","https://quotes.toscrape.com/page/2/",]for url in urls:yield scrapy.Request(url=url, callback=self.parse)# 可以替换为# 不要实现 start_requests() 方法,该方法从 URL 生成 scrapy.Request 对象,您只需定义一个 start_urls 类属性,其中包含 URL 列表。然后,start_requests() 的默认实现将使用此列表为您的 spider 创建初始请求。# 这是因为 parse() 是 Scrapy 的默认回调方法,它针对未明确分配回调的请求调用。start_urls = {"https://quotes.toscrape.com/page/1/","https://quotes.toscrape.com/page/2/",}

3.运行爬虫

在该项目顶级目录下输入一下命令(在tutorial下):

scrapy crawl quotes

这里的quotes必须跟 quotes_spider.py中的name属性保持一致

现在,检查当前目录中的文件,可以发现创建了两个新文件:quotes-1.html 和 quotes-2.html,其中包含各个 URL 的内容,与代码文件中的parse函数的指示一致。

过程为:
Scrapy 调度 scrapy.Request 对象,由 Spider 的 start_requests 方法返回。在收到每个对象的响应后,它实例化 Response 对象并调用与请求关联的回调方法(在本例中,是 parse 方法),将响应作为参数传递。

4.利用css选择器+Scrapy Shell提取数据

注意:在 Windows 上,要使用双引号将参数URL括起来

例如:

在shell命令中输入一下命令

scrapy shell "https://quotes.toscrape.com/page/1/"

运行结果如下:
1.png

例如:

response.css("title")
[<Selector query='descendant-or-self::title' data='<title>Quotes to Scrape</title>'>]response.css("title::text").getall()
['Quotes to Scrape']response.css("title").getall()
['<title>Quotes to Scrape</title>'] response.css("title::text").get()
'Quotes to Scrape'response.css("title::text").re(r"Quotes.*")
['Quotes to Scrape']response.css("title::text").re(r"Q\w+")
['Quotes']response.css("title::text").re(r"(\w+) to (\w+)")
['Quotes', 'Scrape']

官方文档见:https://docs.scrapy.net.cn/en/latest/


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Windows IPv6漏洞CVE-2024-38063
  • spring boot 集成es使用
  • (十三)Flink SQL
  • 海南省政协主席李荣灿调研宇乐乐影业
  • 如何使用 Java 将 JSON 数据转换为 YAML 文件
  • python并发与并行(四) ———— 用queue来协调多个线程之间的工作进度
  • 【Qt】基于VTK9.1+VS2019+Qt5.15.2的点云可视化程序开发
  • 【C++ Primer Plus习题】6.9
  • Elasticsearch(面试篇)
  • 第三十九篇-TeslaP40+CosyVoice-安装
  • 云计算实训38——docker网络、跨主机容器之间的通讯
  • STM32(F103ZET6)第十九课:FreeRtos的移植和使用
  • SQLserver使用sql语句创建主键,外键,唯一约束,自增
  • CSS中的元素布局与定位详细说明
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • hexo+github搭建个人博客
  • 【Amaple教程】5. 插件
  • Apache Spark Streaming 使用实例
  • httpie使用详解
  • javascript从右向左截取指定位数字符的3种方法
  • Java超时控制的实现
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Laravel 中的一个后期静态绑定
  • Octave 入门
  • Python_网络编程
  • Python十分钟制作属于你自己的个性logo
  • 闭包--闭包之tab栏切换(四)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 初识 webpack
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前嗅ForeSpider教程:创建模板
  •  一套莫尔斯电报听写、翻译系统
  • 1.Ext JS 建立web开发工程
  • UI设计初学者应该如何入门?
  • # centos7下FFmpeg环境部署记录
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (+4)2.2UML建模图
  • (70min)字节暑假实习二面(已挂)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (算法)硬币问题
  • (转载)虚函数剖析
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .gitignore
  • .Net Memory Profiler的使用举例
  • .Net 高效开发之不可错过的实用工具
  • .NET 通过系统影子账户实现权限维持
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net项目IIS、VS 附加进程调试
  • /etc/motd and /etc/issue
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [20160807][系统设计的三次迭代]
  • [20170705]diff比较执行结果的内容.txt
  • [240607] Jina AI 发布多模态嵌入模型 | PHP 曝新漏洞 | TypeScript 5.5 RC 发布公告
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt