Day:007(2) | Python爬虫:高效数据抓取的编程技术(scrapy框架使用)

Scrapy 数据的提取

        Scrapy有自己的数据提取机制。它们被称为选择器。我们可以通过使用的选择器re、xpath、css提取数据

提示
不用再安装与引入Xpath,BS4

获得选择器

Response对象获取
正常使用 
response.selector.xpath('//span/text()').get()
response.selector.css('span::text').get()
response.selector.re('<span>')
快捷使用
response.xpath('//span/text').get()
response.css('span::text').get()

创建对象 

from scrapy.selector import Selector

 通过text参数 初始化

body = '<html><body><span>good</span></body></html>'
Selector(text=body).xpath('//span/text()').get()

通过response参数 初始化

from scrapy.selector import Selector
from scrapy.http import HtmlResponse
response =HtmlResponse(url='http://example.com',body=body)
Selector(response=response).xpath('//span/text()').get()
'good'
选择器的方法
S.N.方法 & 描述
extract()、getall()它返回一个unicode字符串以及所选数据
extract_first()、get()它返回第一个unicode字符串以及所选数据
re()它返回Unicode字符串列表,当正则表达式被赋予作为参数时提取
xpath()它返回选择器列表,它代表由指定XPath表达式参数选择的节点
css()它返回选择器列表,它代表由指定CSS表达式作为参数所选择的节点

Scrapy Shell的使用

        Scrapy Shell是一个交互式shell,可以在不运行spider项目时,快速调试 scrapy 代码。

提示
一般用于测试xpath或css表达式,查看它们是否能提取想要的数据

注意
当从命令行运行Scrapy Shell时,记住总是用引号括住url,否则
url包含参数(即 & 字符)不起作用。

在Windows上,使用双引号: 

scrapy shell "https://scrapy.org"

Scrapy 保存数据到文件

  • 用Python原生方式保存
with open("movie.txt", 'wb') as f:for n, c in zip(movie_name,
movie_core):str = n+":"+c+"\n"f.write(str.encode())
  • 使用Scrapy内置方式

         scrapy 内置主要有四种:JSON,JSON lines,CSV,XML
          最常用的导出结果格为JSON,命令如下: 

scrapy crawl dmoz -o douban.json -t json 

 参数设置:

  • -o 后面导出文件名
  • -t 后面导出的类型

                可以省略,但要保存的文件名后缀,写清楚类型

注意
将数据解析完,返回数据,才可以用命令保存,代码如下,格
式为dict或item类型

  • return data
  • yield data

Item Pipeline的使用

        当数据在Spider中被收集之后,可以传递到Item Pipeline中统一进行处理。

特点
        每个item pipeline就是一个普通的python类,包含的方法名如下:

  • 方法名
含义是否必须实现
process_item(self,item,spider)用于处理接收到的item
open_spider(self,spider)表示当spider被开启的时候调用这个方法
close_spider(self,spider)当spider关闭时候这个方法被调用

功能 

  • 接收item

        在 process_item 方法中保存

  • 是否要保存数据

        取决于是否编写代码用于保存数据

  • 决定此Item是否进入下一个pipeline
    • return item 数据进入下一个pipeline
    • drop item 抛弃数据

案例代码 

class SaveFilePipeline:def open_spider(self,spider):self.file = open('douban5.txt','w')def process_item(self, item, spider):self.file.write(f'name:{item.get("name")} score:{item.get("score")}\n')def close_spider(self,spider):self.file.close()
from scrapy.exceptions import DropItemclass XSPipeline:def open_spider(self,spider):self.file =
open('xs.txt','w',encoding='utf-8')def process_item(self, item, spider):if item.get('title'):self.file.write(item.get('title'))self.file.write('\n')return itemelse:raise DropItem(f"Missing title
in {item}")def close_spider(self,spider):self.file.close()

Scrapy 使用ImagePipeline 保存图片 

        Scrapy提供了一个 ImagePipeline,用来下载图片这条管道,图片管道 ImagesPipeline 提供了方便并具有额外特性的功能,比如:

  • 将所有下载的图片转换成通用的格式(JPG)和模式(RGB)
  • 避免重新下载最近已经下载过的图片
  • 缩略图生成
  • 检测图像的宽/高,确保它们满足最小限制

使用图片管道 

scrapy.pipelines.images.ImagesPipeline

 使用 ImagesPipeline ,典型的工作流程如下所示::

  • 在一个爬虫中,把图片的URL放入 image_urls 组内(image_urls是个列表)
  • URL从爬虫内返回,进入图片管道
  • 当图片对象进入 ImagesPipeline,image_urls 组内的URLs将被Scrapy的调度器和下载器安排下载
  • settings.py文件中配置保存图片路径参数 IMAGES_STORE
  • 开启管道

注意
需要安装pillow4.0.0以上版本
pip install pillow==9.2.0 

问题
报错:twisted.python.failure.Failure OpenSSL.SSL.Error



解决方案
pip uninstall cryptography
pip install cryptography==36.0.2 

Scrapy 自定义ImagePipeline

问题

使用官方默认图片管道,有如下几个问题:

  • 文件名不友好
  • 存储图片URL的参数名称与类型太固定


解决方案
自定义ImagePipeline,扩展

自定义图片管道 

  • 继承 scrapy.pipelines.images import ImagesPipeline
  • 实现 get_media_requests(self, item, info) 方法
    • 发送请求,下载图片
    • 转发文件名
  • 实现 file_path(self,request,response=None,info=None,*,item=None)
    • 修改文件名与保存路径

代码 

import reclass Scrapy05Pipeline:def process_item(self, item, spider):return itemfrom scrapy.pipelines.images import ImagesPipeline
from scrapy.http.request import Requestclass MyImagePipeline(ImagesPipeline):def get_media_requests(self, item,info):return Request(item['image_url'])def file_path(self, request,response=None, info=None, *, item=None):# 处理文件名中的特殊字符# name =item.get('name').strip().replace('\r\n\t\t', '').replace('(','').replace(')','').replace('/','_')name = re.sub('/','_',re.sub('[\s()]','',item.get('name')))return  f'{name}.jpg'

Scrapy 中settings配置的使用 

        Scrapy允许自定义设置所有Scrapy组件的行为,包括核心、扩展、管道和spider本身。

官网-参考配置

设置 — Scrapy 2.5.0 文档 (osgeo.cn)icon-default.png?t=N7T8https://www.osgeo.cn/scrapy/topics/settings.html

配置文档

  • BOT_NAME

        默认: 'scrapybot'
        Scrapy项目实现的bot的名字。用来构造默认 User-Agent,同时也用来log。
        当你使用 startproject 命令创建项目时其也被自动赋值。

  • CONCURRENT_ITEMS

        默认: 100
        Item Processor(即 Item Pipeline) 同时处理(每个response的)item的最大值 

  • CONCURRENT_REQUESTS

        默认: 16
        Scrapy downloader 并发请求(concurrent requests)的最大值。 

  • CONCURRENT_REQUESTS_PER_DOMAIN

        默认: 8
        对单个网站进行并发请求的最大值。 

  • CONCURRENT_REQUESTS_PER_IP

        默认: 0
        对单个IP进行并发请求的最大值。如果非0,则忽略
        CONCURRENT_REQUESTS_PER_DOMAIN 设定, 使用该设定。 也就是说,并发限制将针对IP,而不是网站。
        该设定也影响 DOWNLOAD_DELAY: 如果CONCURRENT_REQUESTS_PER_IP 非0,下载延迟应用在IP而不是网站上。 

  • FEED_EXPORT_ENCODING ='utf-8'

        设置导出时文件的编码 

  • DEFAULT_REQUEST_HEADERS

        默认: 

{
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en',
}

         Scrapy HTTP Request使用的默认header。由
         DefaultHeadersMiddleware 产生。

  • DOWNLOADER_MIDDLEWARES

        默认:: {}
        保存项目中启用的下载中间件及其顺序的字典

  • DOWNLOAD_DELAY

        默认: 0
        下载器在下载同一个网站下一个页面前需要等待的时间。该选项可以用来限制爬取速度, 减轻服务器压力。同时也支持小数 

  • DOWNLOAD_TIMEOUT

        默认: 180
        下载器超时时间(单位: 秒)

  •  ITEM_PIPELINES

        默认: {}
        保存项目中启用的pipeline及其顺序的字典。该字典默认为空,值(value)任意。 不过值(value)习惯设定在0-1000范围内

  • DEPTH_LIMIT

        默认: 0
        类: scrapy.spidermiddlewares.depth.DepthMiddleware
        允许为任何站点爬行的最大深度。如果为零,则不会施加任何限制。

  • LOG_ENABLED

        默认: True
        是否启用logging

  • LOG_ENCODING

        默认: 'utf-8'
        logging使用的编码。

  • LOG_FILE

        默认: None
        logging输出的文件名。如果为None,则使用标准错误输出(standard error)。

  • LOG_FORMAT

        默认: '%(asctime)s [%(name)s] %(levelname)s: %(message)s'
        日志的数据格式

  • LOG_DATEFORMAT

        默认: '%Y-%m-%d %H:%M:%S'
        日志的日期格式

  • LOG_LEVEL

        默认: 'DEBUG'

        log的最低级别。可选的级别有: CRITICAL、 ERROR、WARNING、INFO、DEBUG

  • LOG_STDOUT

        默认: False
        如果为 True ,进程所有的标准输出(及错误)将会被重定向到log中

  • ROBOTSTXT_OBEY

        默认: True
        是否遵循robots协议 

  • USER_AGENT

        默认: "Scrapy/VERSION (+http://scrapy.org/)"
        爬取的默认User-Agent,除非被覆盖

Scrapy默认BASE设置

        scrapy对某些内部组件进行了默认设置,这些组件通常情况下是不能被修改的,但是我们在自定义了某些组件以后,比如我们设置了自定义的middleware中间件,需要按照一定的顺序把他添加到组件之中,这个时候需要参考scrapy的默认设置,因为这个顺序会影响scrapy的执行,下面列出了scrapy的默认基础设置

注意
如果想要修改以下的某些设置,应该避免直接修改下列内容,
而是修改其对应的自定义内容

{'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,'scrapy.downloadermiddlewares.retry.RetryMiddleware': 500,'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 550,'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,'scrapy.downloadermiddlewares.chunked.ChunkedTransferMiddleware': 830,'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,
}

 如果需要关闭下载处理器,为其赋值为 None 即可

提示
有时添加了一些自定义的组件,无法应用到效果,可以从执行
顺序方面入手
执行顺序:输值越小,优先级越高

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

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

相关文章

开发有哪些常见陷阱?

引言 在当今数字化时代&#xff0c;软件开发已成为推动科技进步和商业发展的重要引擎。然而&#xff0c;软件开发并非一帆风顺&#xff0c;其中蕴藏着许多陷阱和挑战。如何避免这些陷阱&#xff0c;提高软件开发的效率和质量&#xff0c;成为开发者们面临的重要问题 本文将深…

原型模式:复制对象的智能解决方案

在软件开发过程中&#xff0c;对象的创建可能是一个昂贵的操作&#xff0c;特别是当对象的初始化包括从数据库加载数据、进行IO操作或进行复杂计算时。原型模式是一种创建型设计模式&#xff0c;它通过复制现有的实例来创建新的对象实例&#xff0c;从而避免了类初始化时的高成…

单片机方案 发声毛绒小黄鸭

随着科技的不断进步&#xff0c;智能早教已经成为了新时代儿童教育的趋势。智能早教玩具&#xff0c;一款集互动陪伴、启蒙教育、情感培养于一身的高科技产品。它不仅能陪伴孩子成长&#xff0c;还能在游戏中启迪智慧&#xff0c;是家长和孩子的理想选择。 酷得电子方案开发特…

redis 数据迁移到rds2214(TongRDS-2.2.1.3.Load版 by lqw)

​ 文章目录 一.备份redis文件 vi redis.conf &#xff0c;看看有没有这两行设置&#xff0c;有的话改成跟下面的一致&#xff1a; appendonly yes appendfilename “appendonly.aof” 之后连接redis客户端&#xff0c;输入INFO persistence&#xff0c;如图所示即为开启成功…

使用Docker定时备份数据

文章目录 一、Docker镜像制作二、MySQL数据备份三、Minio数据备份四、数据跨服务器传输五、Nginx日志分割六、Docker启动七、Docker备份日志 一、Docker镜像制作 镜像制作目录 mc下载地址 - rsyncd.conf # https://download.samba.org/pub/rsync/rsyncd.conf.5port 873 uid …

远程桌面防火墙是什么?

远程桌面防火墙&#xff0c;是一种针对远程桌面应用的安全防护工具。它可以在保证远程桌面连接的便利性和高效性的对网络连接进行安全性的保护&#xff0c;防止未经授权的访问和潜在的安全风险。 远程桌面防火墙的主要功能是对远程桌面连接进行监控和管理。它通过识别和验证连接…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题2

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题2 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…

一起学习python——基础篇(18)

上一篇讲述了python中文件夹和文件的检测有无判断、文件夹和文件的创建、文件写入一些内容的方法、文件夹和文件的删除。 这一篇来说一下python的如何读取文件内容。 #文件的路径 testPath"D:/pythonFile/test.txt" #使用open方法&#xff0c;参数为r&#xff1a;表…

C++ 类和对象 上

目录 前言 什么是面向对象&#xff1f;什么是面向过程&#xff1f; 面向过程 面向对象 比较 类 引入 定义 实例化 类的大小 this指针 前言 今天我们来进入C类和对象的学习。相信大家一定听说过C语言是面向过程的语言&#xff0c;而C是面向对象的语言&#xff1f;那么他…

Android 纵向双选日历

这个日历的布局分两部分&#xff0c;一部分是显示星期几的LinearLayout&#xff0c;另外就是一个RecyclerView&#xff0c;负责纵向滚动了。 工具类&#xff1a; implementation com.blankj:utilcode:1.17.3上activity_calendar代码&#xff1a; <?xml version"1.0&…

【CSS面试题】Flex实现九宫格

考察知识&#xff1a; flex布局 水平垂直居中的实现 初始效果 代码关键&#xff1a;给父盒子添加以下属性 flex-wrap: wrap; /* 允许换行 */justify-content: space-around; /* 主轴对齐方式 */align-content: space-around; /* 多行在侧轴上的对齐方式 */<!DOCTYPE html&…

关于阿里云centos系统下宝塔面板部署django/中pip install mysqlclient失败问题的大总结/阿里云使用oss长期访问凭证

python版本3.12.0 项目的版本依赖 问题1 解决方案 sudo vim /etc/profile export MYSQLCLIENT_CFLAGS"-I/usr/include/mysql" export MYSQLCLIENT_LDFLAGS"-L/usr/lib64/mysql" Esc退出编辑模式 &#xff1a;wq退出并且保存 问题二 说是找不到 mysql.h头…

大数据入门之如何利用Phoenix访问Hbase

在大数据的世界里&#xff0c;HBase和Phoenix可谓是一对黄金搭档。HBase以其高效的列式存储和强大的数据扩展能力&#xff0c;成为大数据存储领域的佼佼者&#xff1b;而Phoenix则以其SQL化的操作方式&#xff0c;简化了对HBase的访问过程。今天&#xff0c;就让我们一起看看如…

LC 515.在每个树行中找最大值

515. 在每个树行中找最大值 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9] 示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3] 提示&#xff1a; 二叉树的节点个数的范围是…

【单片机毕业设计8-基于stm32c8t6的RFID校园门禁系统】

【单片机毕业设计8-基于stm32c8t6的RFID校园门禁系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇8基于stm32的RFID校园门禁系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖可私 一、功能介绍 -----------…

【SVN】clean up报错:Cleanup failed to process the following paths 解决方法

报错来源&#xff1a;代码更新有一个文件既不能接受自己的也不能接受别人的&#xff0c;只能取消&#xff0c;再提交提醒clean up&#xff0c;随后报标题错误。 解决方法&#xff1a;参考https://www.cnblogs.com/pinpin/p/11395438.html 注&#xff1a;如果clean up的时候有…

Python(10):常见的4种设计模式(单例/工厂/策略/观察者)

文章目录 一、单例模式二、工厂模式三、策略模式四、观察者模式 程序中设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案&#xff0c;这些解决方案是众多软件按开发人员经过相当长的一段时间的实验和错误总结出来的。使用设计模式是为了重用代码、让代码更容易…

SSL数字证书

SSL数字证书产品提供商主要来自于国外&#xff0c;尤其是美国&#xff0c;原理和使用操作系统一样&#xff0c;区别在于SSL数字证书目前无法替代性&#xff0c;要想达到兼容性99%的机构目前全球才3-4家&#xff0c;目前国内的主流网站主要使用的是国际证书&#xff0c;除了考虑…

文章分享:《二代测序临床报告解读指引》

&#xff3b;摘要&#xff3d; 二代测序&#xff08;next generation sequencing&#xff0c;NGS&#xff09;已成为中国临床肿瘤医生常用检测工具&#xff0c;而中国超 90%临床医生需要 NGS 报告解读支持。因此&#xff0c;为提升临床医生 NGS 报告解读能力&#xff0c;特编写…

django基于python的法院执法案件管理系统

本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中&#xff0c;方便对数据进行操作本课题基于WEB的开发平台&#xff0c;设计的基本思路是&#xff1a; 框架&#xff1a;django/flask 后端&#xff…