Python多进程爬虫东方财富盘口异动数据+Python读写Mysql与Pandas读写Mysql效率对比

先上个图看下网页版数据、mysql结构化数据

通过Python读写mysql执行时间为:1477s,而通过Pandas读写mysql执行时间为:47s,方法2速度几乎是方法1的30倍。在于IO读写上,Python多线程显得非常鸡肋,具体分析可参考:https://cuiqingcai.com/3325.html

1、Python读写Mysql

# -*- coding: utf-8 -*-
import pandas as pd
import tushare as ts
import pymysql
import time
import requests
import json
from multiprocessing import Pool
import traceback

# ====================东方财富个股盘口异动数据抓取============================================================================================================
def EMydSpider(param_list):
    # 抓取东财个股盘口异动数据:http://quote.eastmoney.com/changes

    # 创建计数器
    success, fail = 0, 0

    # 获取当天日期
    cur_date = time.strftime("%Y%m%d", time.localtime())

    # 创建MySQL连接对象
    conn_mysql = pymysql.connect(user=‘root‘, password=‘123456‘, database=‘stock‘, charset=‘utf8‘)
    cursor = conn_mysql.cursor()

    header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3676.400 QQBrowser/10.5.3738.400"}
    url = "http://push2ex.eastmoney.com/getAllStockChanges?type=8201,8202,8193,4,32,64,8207,8209,8211,8213,8215,8204,8203,8194,8,16,128,8208,8210,8212,8214,8216"
    session = requests.Session()
    for param in param_list:
        try:
            html = json.loads(session.get(url=url, params=param, headers=header).text)
            allstock = html[‘data‘][‘allstock‘]
            for stock in allstock:
                stk_code = stock[‘c‘]  # 股票代码,无后缀
                stk_name = stock[‘n‘]  # 股票名称
                chg_time = stock[‘tm‘]  # 异动时间
                chg_type = stock[‘t‘]  # 异动类型
                chg_value = stock[‘i‘]  # 异动值

                try:
                    sql = ‘‘‘insert into stock_yd_list(stk_code,trade_date,chg_time,chg_type,chg_value) values(‘%s‘,‘%s‘,‘%s‘,‘%s‘,‘%s‘)‘‘‘ % (stk_code, cur_date, chg_time, chg_type, chg_value)
                    cursor.execute(sql)
                    conn_mysql.commit()
                    success += 1
                    print("东方财富盘口异动,第%d条数据存储完成......" % success)
                except:
                    conn_mysql.rollback()
                    fail += 1
                    traceback.print_exc()
                    print("东方财富盘口异动,第%d条数据存储失败......" % fail)
        except:
            traceback.print_exc()
            exit()

    cursor.close()
    conn_mysql.close()
    print(‘当天个股盘口异动数据获取完毕,新入库数据:%d条‘ % success)
    print(‘当天个股盘口异动数据获取完毕,入库失败数据:%d条‘ % fail)

# ====================主函数====================================================================================================================================
if __name__==‘__main__‘:
    print("东财异动程序开始执行")
    start = time.time()
    # 定义空列表
    param_list = []
    for page in range(0,300):
        param = {"pageindex": page, "pagesize": ‘64‘, "ut": ‘7eea3edcaed734bea9cbfc24409ed989‘, "dpt": ‘wzchanges‘}
        param_list.append(param)

    # 创建多进程
    pool = Pool(processes=4)

    # 开启多进程爬取东财异动数据
    try:
        pool.map(EMydSpider, (param_list,))
    except:
        print("多进程执行error")
        traceback.print_exc()

    end = time.time()
    print(‘东财异动程序共执行%0.2f秒.‘ % ((end - start)))

执行时间:

2、Pandas读写Mysql

# -*- coding: utf-8 -*-
import pandas as pd
import tushare as ts
import time
import requests
import json
from sqlalchemy import create_engine
from multiprocessing import Pool
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import traceback

# ====================东方财富个股盘口异动数据抓取============================================================================================================
def EMydSpider(param_list):
    # 抓取东财个股盘口异动数据:http://quote.eastmoney.com/changes

    # 获取当天日期
    cur_date = time.strftime("%Y%m%d", time.localtime())

    # 创建空列表
    html_list = []

    header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3676.400 QQBrowser/10.5.3738.400"}
    url = "http://push2ex.eastmoney.com/getAllStockChanges?type=8201,8202,8193,4,32,64,8207,8209,8211,8213,8215,8204,8203,8194,8,16,128,8208,8210,8212,8214,8216"
    session = requests.Session()
    for param in param_list:
        try:
            html = json.loads(session.get(url=url, params=param, headers=header).text)
            html_list.append(html)
        except:
            break

    # 创建用于存储异动数据的空Dataframe
    stock_yd = pd.DataFrame(columns=(‘symbol‘, ‘trade_date‘, ‘chg_time‘,‘chg_type‘,‘chg_value‘))

    for html in html_list:
        try:
            allstock = html[‘data‘][‘allstock‘]
            for stock in allstock:
                code = stock[‘c‘]  # 股票代码,无后缀
                stk_name = stock[‘n‘]  # 股票名称
                chg_time = stock[‘tm‘]  # 异动时间
                chg_type = stock[‘t‘]  # 异动类型
                chg_value = stock[‘i‘]  # 异动值

                stock_yd = stock_yd.append({‘symbol‘:code, ‘trade_date‘: cur_date, ‘chg_time‘: chg_time,‘chg_type‘:chg_type,‘chg_value‘:chg_value}, ignore_index=True)
        except:
            pass

    # 创建Pandas读写数据库引擎
    engine_mysql = create_engine(‘mysql://root:[email protected]/stock?charset=utf8‘)

    # Pandas数据存储
    stock_yd.to_sql(‘stock_yd_list‘, engine_mysql, index=False, if_exists=‘append‘)

    print("新入库数据%s条" % stock_yd.shape[0])

# ====================主函数====================================================================================================================================
if __name__==‘__main__‘:
    print("东财异动程序开始执行")
    start = time.time()

    # 定义空列表
    param_list = []

    for page in range(0,300):
        param = {"pageindex": page, "pagesize": ‘64‘, "ut": ‘7eea3edcaed734bea9cbfc24409ed989‘, "dpt": ‘wzchanges‘}
        param_list.append(param)

    # 创建多进程
    pool = Pool(processes=4)

    # 开启多进程爬取东财异动数据
    try:
        pool.map(EMydSpider, (param_list,))
    except:
        print("多进程执行error")
        traceback.print_exc()

    end = time.time()
    print(‘东财异动程序共执行%0.2f秒.‘ % ((end - start)))

执行时间:

原文地址:https://www.cnblogs.com/Iceredtea/p/12164152.html

时间: 2024-10-09 20:56:19

Python多进程爬虫东方财富盘口异动数据+Python读写Mysql与Pandas读写Mysql效率对比的相关文章

东财盘口异动

import requestsimport jsonimport re url = "http://nuyd.eastmoney.com/EM_UBG_PositionChangesInterface/api/js?"headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578

第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—数据收集(Stats Collection)

第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-数据收集(Stats Collection) Scrapy提供了方便的收集数据的机制.数据以key/value方式存储,值大多是计数值. 该机制叫做数据收集器(Stats Collector),可以通过 Crawler API 的属性 stats 来使用无论数据收集(stats collection)开启或者关闭,数据收集器永远都是可用的. 因此您可以import进自己的模块并使用其API(增加值或者设置新的状态键(stat k

Python小爬虫——抓取豆瓣电影Top250数据

写LeetCode太累了,偶尔练习一下Python,写个小爬虫玩一玩~ 确定URL格式 先找到豆瓣电影TOP250任意一页URL地址的格式,如第一页为:https://movie.douban.com/top250?start=0&filter=,分析该地址: https:// 代表资源传输协议使用https协议: movie.douban.com/top250 是豆瓣的二级域名,指向豆瓣服务器: /top250 是服务器的某个资源: start=0&filter= 是该URL的两个参数,

运维学python之爬虫中级篇(五)数据存储(无数据库版)

本篇主要介绍,爬取html数据后,将html的正文内容存储为json或csv格式. 1 json格式存储 选定要爬取的网站后,我们利用之前学过的内容,如:Beautiful Soup.xpath等方式解析,来获取我们希望得到的内容. 1.1 获取数据 首先使用urllib访问页面https://www.lagou.com/zhaopin/Python/?labelWords=label获取html内容,代码如下: from urllib import request try: url = 'ht

python网络爬虫学习资料

第一:Python爬虫学习系列教程(来源于某博主:http://cuiqingcai.com/1052.html) Python版本:2.7 整体目录: 一.爬虫入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库的高级用法 5. Python爬虫入门五之URLError异常处理 6. Python爬虫入门六之Cookie的使用 7. Python爬虫入门七之正则

什么是Python网络爬虫?带你爬向顶峰

首先我们来介绍一下什么是Python网络爬虫,先大概了解一下关于Python网络爬虫的相关知识点. Python作为一门入门简单,功能强大的,库类完善的语言,身受广大猿友们的喜欢.本身对Python也是非常有好感的,所以时不时的逛逛有关Python的网站啥的.通过在各大Python学习群和论坛的学习,我发现学习Python的人大部分都对网络爬虫很感兴趣.下面给各位介绍下Python的学习流程,并且会给出对应的学习教程. 第一步--学习Python 不管你有没有编程语言基础,也不管你其他语言是多厉

python+SQLAlchemy+爬虫

前面分享了SQLAlchemy的知识,这次我共享一下学习用python开发爬虫再把爬出来的数据放到用SQLAlchemy的数据库上面的知识,当然我这个是带测试,后面我和附带用TDD写的测试. """ 一个简单的豆瓣音乐前250爬虫 Author: Jar.guo email:[email protected] Date: 2016-08-27 Language: Python2.7.10 """ import urllib2 import sys

Python网络爬虫基础知识学习

对Python有一些简单了解的朋友都知识Python编程语言有个很强大的功能,那就是Python网络爬虫(http://www.maiziedu.com/course/python/645-9570/),一提到Python,就会想到相关的Python爬虫和scrapy等等,今天就来简单认识学习Python爬虫的基础知识,有了一定的相关爬虫知识,以后学习scrapy.urllib等等知识时,会相对轻松些. 爬虫: 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组

运维学python之爬虫高级篇(六)scrapy模拟登陆

上一篇介绍了如何爬取豆瓣TOP250的相关内容,今天我们来模拟登陆GitHub. 1 环境配置 语言:Python 3.6.1 IDE: Pycharm 浏览器:firefox 抓包工具:fiddler 爬虫框架:Scrapy 1.5.0 操作系统:Windows 10 家庭中文版 2 爬取前分析 分析登陆提交信息分析登陆信息我使用的是fiddler,fiddler的使用方法就不作介绍了,大家可以自行搜索,首先我们打开github的登陆页面,输入用户名密码,提交查看fiddler获取的信息,我这