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的公衆號,傾盡繁華,爲誰劍指天涯?