使用Scrapy将数据提取到数据库中,进行处理

我们将数据处理的方式,最开始csv文件

再到与数据库建立联系

 代码:

Spider:

import scrapy


class ShuangseqiuSpider(scrapy.Spider):
    name = "shuangseqiu"
    allowed_domains = ["sina.com.cn"]
    start_urls = ["https://view.lottery.sina.com.cn/lotto/pc_zst/index?lottoType=ssq&actionType=chzs&type=50&dpc=1"]

    def parse(self, resp,**kwargs):
        #提取
        trs = resp.xpath("//tbody[@id='cpdata']/tr")
        for tr in trs:  #每一行
            qi = tr.xpath("./td[1]/text()").extract_first()
            hong = tr.xpath("./td[@class='chartball01' or @class='chartball20']/text()").extract()
            lan = tr.xpath("./td[@class='chartball02']/text()").extract()
            #存储
            yield {
                "qi":qi,
                "hong":hong,
                "lan":lan
            }

Pipelines:

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
#1.建立联系
        #弄个坐标
        #写入数据
        #提交事务
        #如果报错,回滚
import pymysql
class Caipiao2Pipeline:
    def open_spider(self,spider):#开启文件
        #打开
        self.f = open("data2.csv",mode='a',encoding="utf-8")    #self====>在这个class中定义一个对象

    def close_spider(self,spider):#关闭文件
        self.f.close()

    def process_item(self, item, spider):


        self.f.write(f"{item['qi']}")
        self.f.write(',')
        self.f.write(f"{item['hong']}")
        self.f.write(',')
        self.f.write(f"{item['lan']}")
        self.f.write("\n")
        # with open("data.csv",mode='a',encoding="utf-8") as f:
        #     f.write(f"{item['qi']}")
        #     f.write(',')
        #     f.write(f"{item['hong']}")
        #     f.write(',')
        #     f.write(f"{item['lan']}")
        #     f.write("\n")
        return item
    # 1.建立联系
    # 弄个坐标
    # 写入数据
    # 提交事务
    # 如果报错,回滚
    #数据库
class CaipiaoPipeline_MySQL:
    def open_spider(self, spider):  # 开启文件
        self.conn = pymysql.connect(host="localhost",
                                    port=3306,
                                    user="root",
                                    password="root",database="caipiao")#1.建立联系

    def close_spider(self, spider):  # 关闭文件
        self.conn.close()

    def process_item(self, item, spider):
        try:
            #弄个坐标
            cursor = self.conn.cursor()
            #写入数据
            sql = "insert into shuangseqiu(qi,lan,hong)values(%s,%s,%s)"
            cursor.execute(sql,(item['qi'],item['lan'],"_".join(item['hong'])))
            #提交事务
            self.conn.commit()
        #如果报错,回滚
        except Exception as e:
            print(e)
            self.conn.rollback()

        print("wanbi")
        return item

settings:

 

做这些修改 :

上面的思路就是:

1.在spider里找到,qi,hong,lan的对应的信息。

然后用yield(字典)进行返回到pipelines,给到item。

def process_item(self, item, spider):

2.然后写入到文件csv文件里

两种方法:1.

 with open("data.csv",mode='a',encoding="utf-8") as f:
     f.write(f"{item['qi']}")
     f.write(',')
     f.write(f"{item['hong']}")
     f.write(',')
     f.write(f"{item['lan']}")
     f.write("\n")

                  2.

    def open_spider(self,spider):#开启文件
        #打开
        self.f = open("data2.csv",mode='a',encoding="utf-8")    #self====>在这个class中定义一个对象

    def close_spider(self,spider):#关闭文件
        self.f.close()

这两个就是,在执行管道的时候会在最开始打开,和最后关闭。

self.f = open("data2.csv",mode='a',encoding="utf-8"

用这个打开文件。

3.这个是加入到Mysql中:

# 1.建立联系
# 弄个坐标
# 写入数据
# 提交事务
# 如果报错,回滚

这是思路。

class CaipiaoPipeline_MySQL:
    def open_spider(self, spider):  # 开启文件
        self.conn = pymysql.connect(host="localhost",
                                    port=3306,
                                    user="root",
                                    password="root",database="caipiao")#1.建立联系

    def close_spider(self, spider):  # 关闭文件
        self.conn.close()

    def process_item(self, item, spider):
        try:
            #弄个坐标
            cursor = self.conn.cursor()
            #写入数据
            sql = "insert into shuangseqiu(qi,lan,hong)values(%s,%s,%s)"
            cursor.execute(sql,(item['qi'],item['lan'],"_".join(item['hong'])))
            #提交事务
            self.conn.commit()
        #如果报错,回滚
        except Exception as e:
            print(e)
            self.conn.rollback()

在第二个管道里,在最开始建立联系,然后正常走。



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

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

相关文章

PyTorch深度学习入门与实战

《PyTorch 深度学习入门与实战(案例视频精讲)》是基于PyTorch 的深度学习入门和实战,结合实际的深度学习案例,由浅入深地介绍PyTorch 在计算机视觉和自然语言处理的相关应用。本书在内容上循序渐进,先介绍了PyTorch 的…

2/26作业

1.link_stack.c #include "link_stack.h" //申请栈顶指针 top_p creat_top() { top_p top (top_p)malloc(sizeof(top_t)); if(topNULL) { printf("空间申请不成功\n"); return NULL; } top->len 0; top->…

Java计划线程池ScheduledThreadPoolExecutor运行流程和源码分析

1. 计划线程池ScheduledThreadPoolExecutor简介 ScheduledThreadPoolExecutor继承自线程池ThreadPoolExecutor,并在其基础上增加了按时间调度执行任务的功能,如果对ThreadPoolExecutor还不是很熟悉,可以阅读一下这篇文章: Java线…

windows安装onlyoffice8.0

安装erlang 安装Erlang25.3 下载地址 设置环境变量 ERLANG_HOME C:\Program Files\Erlang OTP Path下设置%ERLANG_HOME%\bin 打开cmd输入erl不报错即可 安装rabbitmq rabbitmq和erlang对应的关系 下载地址 执行完exe文件后,找到安装目录下的sbin&am…

【JS逆向学习】马蜂窝 cookie 加密(加速乐)

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未…

四 . 分支和循环——Java基础篇

四 . 分支和循环 1 . switch的基本语法 if 和 swicth 的对比: if既可以用于范围校验, 也可以用于等值校验swicth对于if效率更高,只能用于等值校验 语法格式: switch(表达式){case 常量值1:语句块1;//break;case 常量值2:语句块2;//break; // ...[default:语句块n1;break;] }…

H12-821_77

77.如图所示的交换网络,所有交换机都运行了STP协议,当拓扑稳定后,在以下哪台交换机上修改配置BPDU的发送周期,可以影响STD配置BPDU的发送周期? A.STC B.SWD C.SWA D.SWB 答案:C 注释: 在根桥上…

Mysql 高可用解决方案

1.环境说明 操作系统:centos7.7 主服务器:node2(192.168.1.102) 从服务器:node3(192.168.1.103) keepalived中虚拟ip(VIP):192.168.1.100 2.准备事项 主库和从库数据库的版本一致把主库的数据同步给从库一份 3.主库配置 3.1 编辑MySQL配…

机器学习:朴素贝叶斯算法(Python)

一、朴素贝叶斯算法的实现 naive_bayes_classifier.py import numpy as np import collections as cc # 集合的计数功能 from scipy.stats import norm # 极大似然估计样本的均值和标准方差 from data_bin_wrapper import DataBinsWrapperclass NaiveBayesClassifier:"…

绝对路径拼接漏洞 [NISACTF 2022]babyupload

打开题目 最开始以为是文件上传的漏洞 结果发现无论我们上传什么文件都会显示bad filename 去网上看了大佬的wp知道 我们直接去看源代码得到提示 /source 那我们去访问一下这个路径看看 得到一个下载文件 用记事本打开得到 源代码如下 from flask import Flask, request, r…

猫头虎分享已解决Bug || ValueError: Unknown label type: ‘continuous‘

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

Linux:线程控制

目录 线程的相关知识 线程创建 pthread_create 线程关于进程内部资源问题 线程等待 pthread_join 线程退出 pthread_cancel 线程id的理解 pthread_self 线程分离 pthread_detach 线程的相关知识 首先线程是在进程内部执行的,是OS调度的基本单位 线程的…

JAVA学习笔记12

1.键盘输入语句 1.1 介绍 ​ *在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。 1.2 步骤 ​ 1.导入该类的所在包,java.util.* ​ 2.创建该类对象(声明变量) ​ 3.调用里面的功能 import java.…

算法打卡day2|数组篇|Leetcode 977.有序数组的平方、 209.长度最小的子数组、59.螺旋矩阵II

算法题 Leetcode 977.有序数组的平方 题目链接: 977.有序数组的平方 大佬视频讲解:977.有序数组的平方 个人思路 第一时间就只想到暴力解法,双重循环一个循环比较一个循环赋值;但这样可能会超时,所以还能用双指针&#xff0…

halcon中的2D测量-椭圆

一、定义 二维测量指的是测量二维几何图形的参数,例如圆、椭圆、圆弧、矩形的相关参数。这里的参数对圆来说可以是半径;椭圆可以是长半轴、短半轴;矩形则包括宽和高。 二、基本步骤 1.创建测量模型 使用算子 create_metrology_model 2.设…

积分商城管理系统的设计与实现

积分商城管理系统的设计与实现 获取源码——》公主号:计算机专业毕设大全

设计模式(二)单例模式的七种写法

相关文章设计模式系列 面试的时候,问到许多年轻的Android开发他所会的设计模式是什么,基本上都会提到单例模式,但是对单例模式也是一知半解,在Android开发中我们经常会运用单例模式,所以我们还是要更了解单例模式才对…

【任何电机可使用的七段式s曲线-----包括matlab代码和simulink仿真】

永磁同步电机七段式s曲线 一、前言二、理论分析三、7段式s曲线加减速关系图四、matlab代码代码结果 五、simulink七段式s曲线整体框图simulink结果s-function内嵌代码 六、使用双闭环FOC控制-----simulink仿真示意 一、前言 S形:加加速(T1)→>匀加速(T2)→减加速…

【JVM】StringTable 字符串常量池

参考:javaGuide 字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建 String的不可变性 1.通过字面量的方式(区别于new)给一个…

Avalonia学习(二十六)-桌面系统界面Ribbon

这个界面是开源项目中拔下来的,我没有全部改完,只能按照我得界面测试。我还有一个bug没有找到,但是解决了一下。这里没有任何和大家说的,给大家看一下界面效果。 另外地图研究了缩放和显示鼠标位置经纬度