python爬虫进阶篇:Scrapy中使用Selenium+Firefox浏览器爬取国债逆回购并发送QQ邮件通知

一、前言

每到年底国债逆回购的利息都会来一波高涨,利息会比银行的T+0的理财产品的利息高,所以可以考虑写个脚本每天定时启动爬取逆回购数据,实时查看利息,然后在利息高位及时去下单。

二、环境搭建

详情请看《python爬虫进阶篇:Scrapy中使用Selenium模拟Firefox火狐浏览器爬取网页信息》

三、代码实现

  • items
class BondSpiderItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# 股票代码bond_code = scrapy.Field()# 股票名称bond_name = scrapy.Field()# 最新价last_price = scrapy.Field()# 涨跌幅rise_fall_rate = scrapy.Field()# 涨跌额rise_fall_price = scrapy.Field()
  • middlewares
def __init__(self):# ----------------firefox的设置------------------------------- #self.options = firefox_options()def spider_opened(self, spider):spider.logger.info('Spider opened: %s' % spider.name)spider.driver = webdriver.Firefox(options=self.options)  # 指定使用的浏览器def process_request(self, request, spider):# Called for each request that goes through the downloader# middleware.# Must either:# - return None: continue processing this request# - or return a Response object# - or return a Request object# - or raise IgnoreRequest: process_exception() methods of#   installed downloader middleware will be calledspider.driver.get(request.url)return Nonedef process_response(self, request, response, spider):# Called with the response returned from the downloader.# Must either;# - return a Response object# - return a Request object# - or raise IgnoreRequestresponse_body = spider.driver.page_sourcereturn HtmlResponse(url=request.url, body=response_body, encoding='utf-8', request=request)
  • settings设置
SPIDER_MIDDLEWARES = {'bond_spider.middlewares.BondSpiderSpiderMiddleware': 543,
}
DOWNLOADER_MIDDLEWARES = {'bond_spider.middlewares.BondSpiderDownloaderMiddleware': 543,
}
ITEM_PIPELINES = {'bond_spider.pipelines.BondSpiderPipeline': 300,
}
  • middlewares中间件
from selenium.webdriver.firefox.options import Options as firefox_optionsspider.driver = webdriver.Firefox(options=firefox_options())  # 指定使用的浏览器
  • spider文件
    def parse(self, response):# 股票代码bond_code = response.css("table.table_wrapper-table tbody tr td:nth-child(2) a::text").extract()# 股票名称bond_name = response.css("table.table_wrapper-table tbody tr td:nth-child(3) a::text").extract()# 最新价last_price = response.css("table.table_wrapper-table tbody tr td:nth-child(4) span::text").extract()# 涨跌幅rise_fall_rate = response.css("table.table_wrapper-table tbody tr td:nth-child(6) span::text").extract()# 涨跌额rise_fall_price = response.css("table.table_wrapper-table tbody tr td:nth-child(5) span::text").extract()for i in range(len(bond_code)):item = BondSpiderItem()item["bond_code"] = bond_code[i]item["bond_name"] = bond_name[i]item["last_price"] = last_price[i]item["rise_fall_rate"] = rise_fall_rate[i]item["rise_fall_price"] = rise_fall_price[i]yield itemprint()def close(self, spider):spider.driver.quit()
  • pipelines持久化
def __init__(self):self.html = '<html><head><meta charset="utf-8"></head><body><table>'self.html = self.html + '<tr>'self.html = self.html + '<td>%s</td>' % "代码"self.html = self.html + '<td>%s</td>' % "名称"self.html = self.html + '<td>%s</td>' % "最新价"self.html = self.html + '<td>%s</td>' % "涨跌幅"self.html = self.html + '<td>%s</td>' % "涨跌额"self.html = self.html + '</tr>'def process_item(self, item, spider):self.html = self.html + '<tr>'self.html = self.html + '<td>%s</td>' % item["bond_code"]self.html = self.html + '<td>%s</td>' % item["bond_name"]self.html = self.html + '<td>%s</td>' % item["last_price"]self.html = self.html + '<td>%s</td>' % item["rise_fall_rate"]self.html = self.html + '<td>%s</td>' % item["rise_fall_price"]self.html = self.html + '</tr>'return itemdef close_spider(self, spider):self.html = self.html + '</table></body></html>'self.send_email(self.html)print()def send_email(self, html):# 设置邮箱账号account = "xxx"# 设置邮箱授权码token = "xxx"# 实例化smtp对象,设置邮箱服务器,端口smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)# 登录qq邮箱smtp.login(account, token)# 添加正文,创建简单邮件对象email_content = MIMEText(html, 'html', 'utf-8')# 设置发送者信息email_content['From'] = 'xxx'# 设置接受者信息email_content['To'] = '技术总是日积月累的'# 设置邮件标题email_content['Subject'] = '来自code_space的一封信'# 发送邮件smtp.sendmail(account, 'xxx', email_content.as_string())# 关闭邮箱服务smtp.quit()

四、测试结果

在这里插入图片描述

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

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

相关文章

AI数字人克隆系统OEM:为未来创造更多可能

随着科技的发展&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域取得了重要突破。其中&#xff0c;一个备受关注的领域是AI数字人克隆系统。作为一种创新的技术&#xff0c;它引发了人们的浓厚兴趣。本文将以探秘AI数字人克隆系统OEM源码为主题&#xff0c;深入了解这…

如何从0到1搭建一个SpringBoot项目

SpringBoot是大家使用最多的一个Java框架了&#xff0c;今日就来详细介绍一下如何去创建一个SpringBoot项目 一、准备工作 首先要来看你的IDEA版本&#xff0c;如果你的IDEA是【专业版】的&#xff0c;那么你就无需安装任何的插件&#xff0c;直接就可以创建SpringBoot的项目了…

【MIMO 从入门到精通】[P4]【MIMO Communications】

前言&#xff1a; Explains the main approaches to multi-input multi-output (MIMO) communications, including Beamforming, Zero Forcing, and MMSE. * Note that at the 9:19min mark, I made a slight "voice typo", where I should have said: "you nee…

世界首款配备M.2固态硬盘的树莓派Pi 5工业计算机发布!

多年来&#xff0c;上海晶珩一直秉承创新理念&#xff0c;持续不断地推陈出新。在成功推出一系列基于树莓派 Raspberry Pi CM4 的工业计算机后&#xff0c;现推出了全球首款搭载 M.2 固态硬盘的 Raspberry Pi 5 工业计算机ED-IPC3020系列。 ED-IPC3020搭载强大的Broadcom BCM27…

交换机vlan划分方法,学会这三招就够!

你们好&#xff0c;我的网工朋友。 交换机的配置我们说过很多&#xff0c;总有一些朋友会提到vlan的划分&#xff0c;今天就给你说下具体的应用。 关于vlan的划分方法有很多&#xff0c;项目应用中较多的方法就是基于端口划分vlan、基于mac地址划分vlan、基于ip地址划分vlan……

Redis相关的那些事(一)

背景 目前工作所负责的工作主要是投放业务&#xff0c;属于读高并发场景&#xff0c;记录一下之前碰到的redis相关的问题。 热点大值Key&缓存击穿问题 问题表现 在某次流量峰值过程中&#xff0c;redis的CPU突然飙升&#xff0c;从监控看起来就是CPU飙升到一定程度&…

如何使用Jellyfin结合内网穿透搭建私人影音平台远程可访问

作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家如何使用Jellyfin结合内网穿透搭建私人影音平台远程可访问&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 前言…

ARM 汇编语言知识积累

博文参考&#xff1a; arm中SP&#xff0c;LR&#xff0c;PC寄存器以及其它所有寄存器以及处理器运行模式介绍 arm平台根据栈进行backtrace的方法-腾讯云开发者社区-腾讯云 (tencent.com) 特殊功能寄存器&#xff1a; SP&#xff1a; 即 R13&#xff0c;栈指针&#xff0c;…

JuiceSSH结合内网穿透实现公网远程访问本地Linux虚拟机

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

MAC鼠标中键的使用

MAC鼠标没有鼠标中键&#xff0c;于是在一些场景中用起来非常麻烦&#xff0c;这里介绍几种键盘快捷键鼠标左键实现中键功能的例子&#xff1a; 1&#xff09;在sublime text 或者pycharm等一些文本编辑器或IDE中实现中键修改一列数据中特定位置的值 FNOPT左键另外还有C4D&…

Go爬虫程序采集抖音快手商户 开店不再难

最近遇到一群客户&#xff0c;在疯狂做抖店&#xff0c;看他们朋友圈一天销售额都好几万&#xff0c;几天就能起一个店铺&#xff0c;而且一个人可以管理很多店铺。今天我们就以抖店上的商户种类来做个数据采集&#xff0c;主要是分析商品类别以及热门程度。 实现这个任务&…

【四】记一次关于架构设计从0到1的讨论

记一次关于架构设计从0到1的讨论 简介&#xff1a; 在一次面试中和面试官讨论起来架构设计这个话题&#xff0c;一聊就不知不觉一个小时了&#xff0c;感觉意犹未尽。现在回想起来感觉挺有意思的&#xff0c;古人说独学而无友则孤陋而寡闻&#xff0c;的确是这样的&#xff0c…

C++ opencv-3.4.1 提取不规则物体的轮廓

在学习opencv的时候&#xff0c;对一张照片&#xff0c;需要标注照片上物体的不规则轮廓。 如图: 使用opencv进行物体的轮廓处理&#xff0c;关键在于对照片的理解&#xff0c;前期的照片处理的越好最后调用api出来的结果就越接近理想值。 提取照片中物体分如下三步&#xff…

全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解——windows应急响应篇

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

【Spring】SpringBoot 配置文件

文章目录 什么是配置文件SpringBoot配置文件配置文件快速入手配置文件的格式properties 配置文件说明properties 基本语法读取配置文件信息properties 配置格式缺点 yml 配置文件说明yml 基本语法使用 yml 连接数据库 yml 使用进阶yml 配置不同数据类型配置对象配置集合配置Map…

【prompt一】Domain Adaptation via Prompt Learning

1.Motivation 当前的UDA方法通过对齐源和目标特征空间来学习域不变特征。这种对齐是由诸如统计差异最小化或对抗性训练等约束施加的。然而&#xff0c;这些约束可能导致语义特征结构的扭曲和类可辨别性的丧失。 在本文中&#xff0c;引入了一种新的UDA提示学习范式&#xff0…

RPC 实战与原理

文章目录 什么是 RPC&#xff1f;RPC 有什么作用&#xff1f;RPC 步骤为什么需要序列化&#xff1f;零拷贝什么是零拷贝&#xff1f;为什么需要零拷贝&#xff1f;如何实现零拷贝&#xff1f;Netty 的零拷贝有何不同&#xff1f; 动态代理实现HTTP/2 特性为什么需要服务发现&am…

ElasticSearch入门介绍和实战

目录 1.ElasticSearch简介 1.1 ElasticSearch&#xff08;简称ES&#xff09; 1.2 ElasticSearch与Lucene的关系 1.3 哪些公司在使用Elasticsearch 1.4 ES vs Solr比较 1.4.1 ES vs Solr 检索速度 2. Lucene全文检索框架 2.1 什么是全文检索 2.2 分词原理之倒排索引…

easypoi通过反射修改表头,poi,workbook修改表头

没废话上代码&#xff0c; 使用easypoi导出时一般会用到一个实体类 提供一个示例代码&#xff1a; 实体类&#xff1a; Data public class TestVO {private String id;Excel(name "字段1")private String findId1;Excel(name "字段2")private String fi…

Windows 10中查找文件的3种方法,就差不多够你查找想要的文件了

本文介绍了在Windows 10计算机上搜索文件的两种主要方法&#xff0c;以及对第三方搜索应用程序的建议和更好地搜索文件的有用提示。 使用任务栏搜索栏进行常规搜索 永久位于屏幕底部的搜索栏是大多数人的首选搜索方法&#xff0c;使用起来毫不费力。如果你不知道在哪里可以找…