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

news2024/11/28 0:48:22

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flask毕业设计选题管理系统python+django_96r19

本系统选择编程语言。Pymysql是封装了MySQL驱动的Python驱动一个能使Python连接到MySQL的库。Python语言官方规范访问数据库的统一接口规范(Python DB-API)&#xff0c;防止在使用不同数据库时&#xff0c;由于底层数据库技术不同造成接口程序紊乱的问题。通过本次系统设计可以…

处理json文件,并将数据汇总至Excel表格

从scores.jason文件中读取学生信息,输出学生的学号&#xff0c;姓名&#xff0c;各科成绩&#xff0c;平均分, 各科标准差 效果&#xff1a; # # 从scores.jason文件中读取学生信息,输出学生的学号&#xff0c;姓名&#xff0c;各科成绩&#xff0c;平均分, 各科标准差 impor…

K8S哲学 - 常见的资源类型

资源类型 namespace kubectl apply 和 kubectl create kubectl apply是声明式的 和 kubectl create是命令式的对吗 deployment 和 job的区别 k8s 的 lable 的意义

政安晨:【Keras机器学习实践要点】(二十七)—— 使用感知器进行图像分类

目录 简介 设置 准备数据 配置超参数 使用数据增强 实施前馈网络&#xff08;FFN&#xff09; 将创建修补程序作为一个层 实施补丁编码层 建立感知器模型 变换器模块 感知器模型 编译、培训和评估模式 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍…

RREA论文阅读

Relational Reflection Entity Alignment 关系反射实体对齐 ABSTRACT 实体对齐旨在识别来自不同知识图谱(KG)的等效实体对&#xff0c;这对于集成多源知识图谱至关重要。最近&#xff0c;随着 GNN 在实体对齐中的引入&#xff0c;近期模型的架构变得越来越复杂。我们甚至在这…

STM32—DMA直接存储器访问详解

DMA——直接存储器访问 DMA&#xff1a;Data Memory Access, 直接存储器访问。 DMA和我们之前学过的串口、GPIO都是类似的&#xff0c;都是STM32中的一个外设。串口是用来发送通信数据的&#xff0c;而DMA则是用来把数据从一个地方搬到另一个地方&#xff0c;而且不占用CPU。…

2024年经济发展、社会科学与贸易国际会议(ICEDSST2024)

2024年经济发展、社会科学与贸易国际会议(ICEDSST2024) 会议简介 2024年国际经济发展、社会科学与贸易会议&#xff08;ICEDSST2024&#xff09;将在中国深圳举行&#xff0c;主题为“经济发展、社科与贸易”。ICEDSST2024汇集了来自世界各地经济发展、社科与贸易领域的学者、…

Ubuntu无网络标识的解决方法

1.出现的情况的特点 2.解决办法 2.1 进入root并输入密码 sudo su 2.2 更新NetworkManager的配置 得先有gedit或者vim&#xff0c;两个随意一个&#xff0c;这里用的gedit&#xff0c;没有就先弄gedit&#xff0c;有的话直接下一步 apt-get install gedit 或者vim apt-get ins…

Vim:强大的文本编辑器

文章目录 Vim&#xff1a;强大的文本编辑器Vim的模式命令模式常用操作光标移动文本编辑查找和替换 底行命令模式常用操作Vim的多窗口操作批量注释与去注释Vim插件推荐&#xff1a;vimforcpp结论 Vim&#xff1a;强大的文本编辑器 Vim&#xff0c;代表 Vi IMproved&#xff0c;…

基于小程序实现的医院预约挂号系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

Android网络抓包--Charles

一、Android抓包方式 对Https降级进行抓包&#xff0c;降级成Http使用抓包工具对Https进行抓包 二、常用的抓包工具 wireshark&#xff1a;侧重于TCP、UDP传输层&#xff0c;HTTP/HTTPS也能抓包&#xff0c;但不能解密HTTPS报文。比较复杂fiddler&#xff1a;支持HTTP/HTTPS…

Swift Zulian Tiger

Swift Zulian Tiger 迅捷祖利安猛虎 16万金&#xff08;游戏币&#xff09; 1万金大概就能兑换460元~600元之间&#xff0c;6400元-9600元&#xff0c;汗颜 故事的一天刚打完BWL&#xff0c;才125金&#xff08;游戏币&#xff09; 本来想下线的结果他们说你太黑了&…

工控 modbusTCP 报文

Tx 发送报文:00 C9 00 00 00 06 01 03 00 00 00 02 Rx 接收报文:00 C9 00 00 00 07 01 03 04 01 4D 00 01 Tx 发送报文:00 C9 00 00 00 06 01 03 00 00 00 02 00 C9 事务处理标识符 2字节 00 00 协议标识符 2字节 固定 00 00 00 06 长度 2字节 表示之后的字节总数 &#xff08;…

贪心算法|968.监控二叉树

力扣题目链接 class Solution { private:int result;int traversal(TreeNode* cur) {// 空节点&#xff0c;该节点有覆盖if (cur NULL) return 2;int left traversal(cur->left); // 左int right traversal(cur->right); // 右// 情况1// 左右节点都有覆盖if (le…

MariaDB介绍和安装

MariaDB介绍和安装 文章目录 MariaDB介绍和安装1.MariaDB介绍2.MariaDB安装2.1 主机初始化2.1.1 设置网卡名和ip地址2.1.2 配置镜像源2.1.3 关闭防火墙2.1.4 禁用SELinux2.1.5 设置时区 2.2 包安装2.2.1 Rocky和CentOS 安装 MariaDB2.2.2 Ubuntu 安装 MariaDB 2.3 源码安装2.3.…

紫光展锐携手中国联通智慧矿山军团(山西)完成RedCap现网环境测试

近日&#xff0c;紫光展锐与中国联通智慧矿山军团&#xff08;山西&#xff09;在现网环境下成功完成了RedCap技术测试。此次测试对搭载紫光展锐RedCap芯片平台V517的模组注网速度和信号情况、Iperf打流测试上下行情况、ping包延时情况以及模组拨号入网压测等项目进行了全面验证…

【性能测试】接口测试各知识第3篇:Jmeter 基本使用流程,学习目标【附代码文档】

接口测试完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;接口测试&#xff0c;学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标&#xff0c;RESTFUL1. 理解接口的概念,2.什么是接口测试…

# Contrastive Learning(对比学习)--CLIP笔记(一)

Contrastive Learning&#xff08;对比学习&#xff09;–CLIP笔记&#xff08;一&#xff09; 参考&#xff1a;CLIP 论文逐段精读【论文精读】_哔哩哔哩_bilibili CLIP简介 CLIP是一种多模态预训练模型&#xff0c;由OpenAI在2021年提出&#xff0c;论文标题&#xff1a;L…

STM32 DCMI 的带宽与性能介绍

1. 引言 随着市场对更高图像质量的需求不断增加&#xff0c;成像技术持续发展&#xff0c;各种新兴技术&#xff08;例如3D、计算、运动和红外线&#xff09;的不断涌现。如今的成像应用对高质量、易用性、能耗效率、高集成度、快速上市和成本效益提出了全面要求。为了满足这些…

【自然语言】使用词袋模型,TF-IDF模型和Word2Vec模型进行文本向量化

一、任务目标 python代码写将 HarryPorter 电子书作为语料库&#xff0c;分别使用词袋模型&#xff0c;TF-IDF模型和Word2Vec模型进行文本向量化。 1. 首先将数据预处理&#xff0c;Word2Vec 训练时要求考虑每个单词前后的五个词汇&#xff0c;地址为 作为其上下文 &#xf…