python基於selenium自動化的股票歷史數據爬取,但是難產了

Bourne同志這次用python爬取數據發生了嚴重車禍,現場慘不忍睹,堪比近期紅遍網絡的高速岔口轎車爬上了指路牌,啊!

python中selenium的環境搭建是極其簡單的,相比於R要簡單許多,同時在運行上相對穩定些。

圖片源自:澎湃新聞

這次用了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()

給你們看看測試中入庫的點數據吧,還準備分析了,這下分析個錘子。

 

BOURNE的公衆號,傾盡繁華,爲誰劍指天涯? 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章