python基于selenium自动化的股票历史数据爬取,但是难产了

Bourne同志这次用python爬取数据发生了严重车祸,现场惨不忍睹,堪比近期红遍网络的高速岔口轿车爬上了指路牌,啊!

python中selenium的环境搭建是极其简单的,相比于R要简单许多,同时在运行上相对稳定些。

python基于selenium自动化的股票历史数据爬取,但是难产了_第1张图片 图片源自:澎湃新闻

这次用了selenium模块、正则表达式,正在准备的代理池。

 

万万没想到前天早上突然发现那个网站竟然消失了,没有了,我的个天啊,搞了好几天的东西,马上又得换新的网站或者客户端去测试了进行抓取。各位同志选择网站的时候慎重啊!还是大平台,什么网易、雅虎、新浪、同花顺等好点。

 

 

#selenium环境搭建
import wheel
#安装selenium
#pip install E:\py\selenium-3.141.0-py2.py3-none-any.whl
import selenium
from selenium import webdriver

前面这部分selenium操作浏览器输入、清除股票代码只给具体操作,并未与整个股票数据抓取代码连接起来,所以,千万不要直接复制过去,是会报一帕拉错的
def browser_operation():
    #打开火狐浏览器
    browser = webdriver.Firefox()
    # 前往指定网页
    browser.get("http://www.aigaogao.com/tools/history.html?s=")
    # 找到输入框id,并输入值
    browser.find_element_by_id("s").send_keys("000595")
    # 找到回车键/搜索键并点击,得到搜索结果
    browser.find_element_by_name("好了").click()
    # 传入一堆股票代码
    stocks_code_list = list[一堆股票代码]
    # 清除输入框数据,进行下一条CODE输入
    browser.find_element_by_id("s").clear()


#需要用到的包载入
import pandas as pd
import re
import requests
from  requests.exceptions  import RequestException
import lxml
from lxml import etree
import pymysql
import time

def create_table():
    # 连接数据库,创建对应数据库的电影数据存储表,便于数据爬取后存入
    db=pymysql.connect(host='localhost', user='root', password='密码', port=3306,db='mine')
    cursor = db.cursor()
    # 创建电影数据存储表的语句用游标写,若已经存在创建的表则不会重复创建,当然这个表的参数设置是有些不合理的哈。这个数据库字段的格式啊,开始设置根据字段的类型设置格式发现总是报错,传入的数据格式有问题,最后干脆把全部数据改为文本格式,省了不少麻烦。
    sql_create='create table if not exists stocks_data(id int auto_increment primary key,' \
           'stock_deal_date varchar(255) not null,' \
           'stock_open_price varchar(255) not null,' \
           'stock_high_price varchar(255) not null,' \
           'stock_low_price varchar(255) not null,' \
           'stock_close_price varchar(255) not null,' \
           'stock_turnover varchar(255) not null,' \
           'stock_traction_amount varchar(255) not null,' \
           'stock_raise_fall_amount varchar(255) not null,' \
           'stock_raise_fall_percent varchar(255) not null,' \
           'stock_shrink varchar(255),' \
           'stock_high_low_differ varchar(255) not null,' \
           'stock_sz_index varchar(255) not null,' \
           'stock_sz_percent varchar(255) not null)'
    cursor.execute(sql_create)
    db.close()
    print('股票数据存储表stocks_data创建成功')

#定义headers,请求网页并获取网页响应状态,解析网页,设置休眠时间,防止封禁,当然如此小的数据量不存在的
def main():
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT k0.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.kk0 Safari/537.36'}
    shares_url=browser.current_url
    url_response = requests.get(shares_url,headers=headers)
    html_analysis = etree.HTML(url_response.text)
    create_table()
    st_data=[]
    get_data(html_analysis,st_data)
    insert_sql(html_analysis,st_data)
    time.sleep(1)

#利用lxml库xpath获取网页数据

def get_data(html_analysis,st_data):
#股票相应价格、开盘、收盘、高低差等冗杂数据
    stock_deal_price = html_analysis.xpath("//div[1][@id='ctl16_contentdiv']/table/tr/td")
#单独提取股票时间
    stock_deal_datetime = html_analysis.xpath("//div[1][@id='ctl16_contentdiv']/table/tr/td/a/@name")
#单独提取股票百分比指标
    stock_deal_percent= html_analysis.xpath("//div[1][@id='ctl16_contentdiv']/table/tr/td//text()")
    stock_percent_empty=re.sub(' ','',','.join(stock_deal_percent).strip())
#正则表达式筛选百分比数据
    stock_match_percent=re.findall('-?\d+\.{1}\d{2}%|,/,',stock_percent_empty)
    #stock_deal_date = html_analysis.xpath("//div[1][@id='ctl16_contentdiv']/table/tr/td/a/@name")
    for i in range(len(stock_deal_datetime)):
        stock_code=stocks_code_list[]
        stock_deal_date= stock_deal_datetime[i].strip()
        stock_open_price= stock_deal_price[14 + i*13].text.strip()
        stock_high_price= stock_deal_price[15 + i*13].text.strip()
        stock_low_price= stock_deal_price[16 + i*13].text.strip()
        stock_close_price= stock_deal_price[17 + i*13].text.strip()
        stock_turnover= stock_deal_price[18 +i*13].text.replace(',','').strip()
        stock_traction_amount= stock_deal_price[19 + i*13].text.replace(',','').strip()
        stock_raise_fall_amount= stock_deal_price[20 + i*13].text.strip()
        stock_raise_fall_percent=stock_match_percent[i*3].strip()
        stock_shrink=str(stock_deal_price[22+i*13].text).strip()
        stock_high_low_differ=stock_match_percent[1+i*3].strip()
        stock_sz_index= stock_deal_price[24 +i*13].text.strip()
        stock_sz_percent=stock_match_percent[2+i*3].strip()
#整合数据
        st_data.append([stock_deal_date,stock_open_price,stock_high_price,stock_low_price,stock_close_price,
                   stock_turnover,stock_traction_amount,stock_raise_fall_amount,stock_raise_fall_percent,
                   stock_shrink,stock_high_low_differ,stock_sz_index,stock_sz_percent])
        #time.sleep(1)
        print(stock_deal_date, stock_open_price, stock_high_price, stock_low_price, stock_close_price,
        stock_turnover, stock_traction_amount, stock_raise_fall_amount, stock_raise_fall_percent,
        stock_shrink, stock_high_low_differ, stock_sz_index, stock_sz_percent)




#数据同步入库,这里并不是同步入库哈,是数据解析获取完后入库,并不是实时入库
def insert_sql(html_analysis,stock_data):
    db = pymysql.connect(host='localhost',
                             user='root',
                             password='密码',
                             port=3306,
                             db='mine')
    cur = db.cursor()
    stock_deal_datetime =html_analysis.xpath("//div[1][@id='ctl16_contentdiv']/table/tr/td/a/@name")
    for i in stock_data:
        insert_data=i
#用格式化符%s来避免插入数据字符拼接的问题,value值用统一的元组来传递避免出错
        sql ="""insert into stocks_data(stock_deal_date,stock_open_price,stock_high_price,
        stock_low_price,stock_close_price,stock_turnover,stock_traction_amount,
        stock_raise_fall_amount,stock_raise_fall_percent,stock_shrink,stock_high_low_differ,
        stock_sz_index,stock_sz_percent) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
#用游标把数据同步入库,当发生错误时候便会回滚,取消错误插入
        try:
            cur.execute(sql,insert_data)
            db.commit()
            print('交易日期为:—'+insert_data[0]+'  的股票数据正在入库')
        except:
                db.rollback()
                print('交易日期为:—'+insert_data[0]+'股票数据入库失败')
    cur.close()
    db.close()

if __name__== "__main__":
    main()

给你们看看测试中入库的点数据吧,还准备分析了,这下分析个锤子。

python基于selenium自动化的股票历史数据爬取,但是难产了_第2张图片

 

BOURNE的公众号,倾尽繁华,为谁剑指天涯? 

 

你可能感兴趣的:(python骚操作)