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 DropItem

class 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 item
        else:
            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 re

class Scrapy05Pipeline:
    def process_item(self, item, spider):
        return item

from scrapy.pipelines.images import ImagesPipeline
from scrapy.http.request import Request

class 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 即可

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

架构设计-权限系统之权限系统设计方案

前言 权限管理是所有后台系统的都会涉及的一个重要组成部分&#xff0c;主要目的是对不同的人访问资源进行权限的控制&#xff0c;避免因权限控制缺失或操作不当引发的风险问题&#xff0c;如操作错误&#xff0c;隐私数据泄露等问题。 目前在公司负责权限这块&#xff0c;所…

blender安装mmd并导入pmx,pmd文件

点击链接GitHub上下载这个&#xff0c;值得注意的是blender4.0以上版本暂时不支持&#xff0c;这里使用的是blender3.6版本GitHub - powroupi/blender_mmd_tools: mmd_tools is a blender addon for importing Models and Motions of MikuMikuDance. 复制当前内容 粘贴到当前…

对LSTM的通俗易懂理解--可变权重

RNN的问题&#xff1a;长期依赖&#xff0c;即对短期的数据敏感&#xff0c;对比较远的长期数据不敏感&#xff0c;这是因为RNN隐藏状态权重在不同时刻是共享相同的&#xff0c;随着时间步的增加&#xff0c;梯度会指数级地衰减或者增长&#xff0c;导致梯度消失或者爆炸&#…

040—pandas 实现RFM用户分层

使用步骤 读入数据 代码如下&#xff08;示例&#xff09;&#xff1a; # RFM 是典型的用户分层方法&#xff0c; 是评估用户消费能力、 衡量用户贡献价值的重要工具。 # RFM 代表的是最近一次消费时间间隔&#xff08;Recency&#xff09;、消费频率&#xff08;Frequency&…

qutip,一个高级的 Python 量子力学研究库!

目录 前言 安装 特性 基本功能 量子态的创建和操作 量子态的测量 示例代码 动力学模拟 高级功能 退相干和噪声模拟 控制和优化 量子信息学工具 实际应用场景 量子态演化研究 量子计算机模拟 量子纠错协议 总结 前言 大家好&#xff0c;今天为大家分享一个高级的 Pytho…

蓝桥杯-STL-string

目录 字符串定义 字符串初始化 字符串输入输出 字符串输出 字符串输入 字符串访问 字符串拷贝 字符串拼接 直接相加 append(const char*str,int n) 字符串比较 ​编辑字符串长度length()/size() 字符串查找find(string str) 查找子串substr(int a,int b) 字符串的…

家居网购项目(三)

文章目录 1.后台管理—添加家居1.需求分析2.程序框架图3.修改FurnDao添加方法add 4.修改FurnDaoImpl添加方法add 5.单元测试FurnDaoTest.java 6.修改FurnService添加方法add 7.修改FurnServiceImpl添加方法add 8.单元测试FurnServiceTest.java 9.修改furn_add.jsp10.修改FurnSe…

用于扩展Qt自身的插件(下)

扩展Qt自身的插件 引言必须满足项创建插件示例代码生成插件配置加载插件的环境创建使用插件的项目配置库和头文件依赖的步骤:应用程序代码运行结果总结引言 本文继上篇的扩展Qt自身的插件,接着记录Qt自身的插件,只不过本文提及的用于扩展Qt自身的插件是可以在QtCreator的设…

读《AI营销画布》客户关系维护的当代挑战(二)

前言 技术进步、用户连接与信息冗余这三股力量已经让人无法真正高质量的获取有用的信息&#xff0c;在对进步与高质量前面提出解决方案时&#xff0c;我们需要对挑战清楚的认识&#xff0c;所以&#xff0c;今天就这三个也解读一下。 1.信息泛滥与爆炸 如图还是19年的&#xf…

股票价格预测 | Python使用GAN预测股票价格

文章目录 效果一览文章概述代码设计效果一览 文章概述 生成对抗网络(GAN)是一种强大的机器学习模型,用于生成以假乱真的数据。然而,使用GAN来预测股票价格可能会面临以下挑战: 数据可用性:GAN需要大量的数据进行训练,以便生成准确的输出。对于股票价格预测,历史股票价…

基于单片机的智能居家火灾报警系统

摘要:采用STC15L2K32单片机设计了一种智能火灾报警系统,它是控制中心与多个不同功能的探测模块构成,实现了一个中心、多点辐射的火灾检测和报警功能。 关键词:智能居家,火灾报警系统,单片机,模块化设计。 0 引言 近些年电子技术、计算机技术为火灾报警系统和灭火系统在…

Python实现PDF页面的删除与添加

在处理PDF文档的过程中&#xff0c;我们时常会需要对PDF文档中的页面进行编辑操作的情况&#xff0c;如插入和删除页面。通过添加和删除PDF页面&#xff0c;我们可以增加内容或对不需要的内容进行删除&#xff0c;使文档内容更符合需求。而通过Python实现PDF文档中的插入和删除…

明明设置数字居中对齐,为什么excel的数字却不居中?

有时候在excel里&#xff0c;选中数据&#xff0c;设置对齐方式 左右居中&#xff0c;然而&#xff0c;数字却怎么都不居中&#xff0c;为什么呢&#xff1f; 1.按快捷键Ctrl1&#xff0c;打开单元格自定义格式对话框&#xff0c;看到是初始界面是在数字的会计专用&#xff0c;…

TDengine too many open files

too many open files 是比较常见的报错&#xff0c;尤其使用TDengine 3.0 集群时&#xff0c;大概率会遇到。这个报错很简单&#xff0c;但要想顺利解决&#xff0c;却涉及到很多知识点。 目录 知识点&#xff1a;fs.nr_open知识点&#xff1a;file-max & fs.file-nr知识点…

VSCode中 task.json 和 launch.json 的作用和参数解释以及配置教程

前言 由于 VS Code 并不是一个传统意义上的 IDE&#xff0c;所以初学者可能在使用过程中会有很多的疑惑&#xff0c;其中比较常见的一个问题就是 tasks.json和 launch.json两个文件分别有什么作用以及如何配置 tasks.json VSCode 官网提供的 tasks.json 配置教程 使用不同的…

探索HTTP协议的世界 | 从基础到高级应用,原理与实践相结合(请求篇)

从基础到高级应用&#xff0c;原理与实践相结合 什么是Http历代Http协议主要特点格式和URL协议内容请求行格式如下请求方法简单案例 消息报头报头域的格式HTTP消息报头类型普通报头优化方向报头&#xff08;缓存&#xff09;Cache-Control的选项其他相关的缓存报头 请求报头Acc…

CLIP大模型图文检索——原理解读及代码实现

一. 核心思想 通过自然语言处理获得的监督信号可用于训练迁移效果出色的视觉模型。本论文的作者团队构建了一个庞大的图像文本配对数据集&#xff0c;其中包含400 million个图片文本的配对。利用最大规模的ViT-large模型&#xff0c;他们提出了CLIP&#xff08;Contrastive La…

Day38 代码随想录(1刷)动态规划

目录 343. 整数拆分 96. 不同的二叉搜索树 343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1…

SQLite 在Android安装与定制方案(十七)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite超详细的编译时选项&#xff08;十六&#xff09; 下一篇&#xff1a;SQLite Android 绑定&#xff08;十八&#xff09; 安装 有三种方法可以将 SQLite Android 绑定添加到应用程序&#xff1a; 1、通过…

迭代器模式:统一访问集合元素的优雅方式

在面向对象的软件开发中&#xff0c;迭代器模式是一种行为型设计模式&#xff0c;它提供了一种方法来顺序访问一个聚合对象中的各个元素&#xff0c;而又无需暴露该对象的内部表示。这种模式是集合处理特别是遍历集合的核心机制。本文将详细介绍迭代器模式的定义、实现、应用场…