Bourne同志这次用python爬取数据发生了严重车祸,现场惨不忍睹,堪比近期红遍网络的高速岔口轿车爬上了指路牌,啊!
万万没想到前天早上突然发现那个网站竟然消失了,没有了,我的个天啊,搞了好几天的东西,马上又得换新的网站或者客户端去测试了进行抓取。各位同志选择网站的时候慎重啊!还是大平台,什么网易、雅虎、新浪、同花顺等好点。
#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()
给你们看看测试中入库的点数据吧,还准备分析了,这下分析个锤子。