最近在家休息,更新较慢。今天来分析一下爬取股票数据,供大家讨论参考。
首先找到网页URL:
http://quotes.money.163.com/trade/lsjysj_600887.html?year=2010&season=1,这里引用的是网易财经的个股网页。分析网页可以看出年份和季度,我们只需要做一个循环,修改一个年份和季度就可以访问所有网页。
这是主页情况界面
分析主页:
我们需要的日期,开盘价,最高价,最低价等待每天的数据都在标签
下的里面,并且每天都在一个里面,因此分析完以后开始写爬虫程序。直接上代码,然后每一行备注,方便大家理解。
首先引入包:
from selenium import webdriver #这个爬虫仍然用selenium的方式
import requests
from selenium.webdriver.chrome.options import Options
#这是selenium的配置包
import time #引入时间,看爬虫要花费多少时间
import csv #把爬取的导入CSV表格中
import pandas as pd #引入pandas来保存
这个是爬虫程序:
def spider(count):
trs=driver.find_elements_by_xpath("//table[@class='table_bg001 border_box limit_sale']/tbody/tr") #用xpath方式查找元素,tr
print(len(trs)) #这个是看每一页,也就是一个季度的日期个数,工作日才开盘
try:
for tr in trs:
#这是得到tr中所有的文本,也就是每个的各类数据,但是是在一起的,用空格分开split(''),形成列表,方便提取。这个在字符串中很常用
tds=tr.text.split(' ')
print(tds) #列表里面的值都是字符串类型,以后数据用于数据分析不方便
date=tds[0] #列表中第一项是日期
kai_price=tds[1] #第二项是开盘价,依次类推
zuigao_price=tds[2]
zuidi_price=tds[3]
shou_price=tds[4]
zhangdie_e=tds[5]
zhangdie_fu=tds[6]
chengjiao_liang=tds[7]
chengjiao_e=tds[8]
zhengfu=tds[9]
huanshoulv=tds[10]
print(count)
count+=1 #设置的一个技术器
#这里仍然使用yield来返回数据,因为爬取20年的数据比较大,因此每爬取一天的数据返回一次,这样节约内存
yield [date,kai_price,zuigao_price,zuidi_price,shou_price,zhangdie_e,zhangdie_fu,chengjiao_liang,chengjiao_e,zhengfu,huanshoulv]
except:
print("spdier erro")
主程序:
start=time.perf_counter() #引入时间
#url="http://quotes.money.163.com/trade/lsjysj_600887.html?year=2000&season=1"
chrome_options=Options() #隐藏打开的浏览器 可以删除
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu") #隐藏打开的浏览器
driver=webdriver.Chrome(chrome_options=chrome_options) #隐藏打开的浏览器
global count #定义一个变量来计数
count=1
title=['日期','开盘价','最高价','最低价','收盘价','涨跌额','涨跌幅','成交量','成交额','振幅','换手率'] #设置表格的头部信息
stoc_t=pd.DataFrame(columns=title) #简历pandas的表格
stoc_t.to_csv("伊利股票1.csv",mode='a',index=False,encoding='ANSI') #加上index=False 后,表的前面就不会空出一列出来了,意思是不要行索引
print("保存成功title")
try:
for i in range(2000,2021):
for j in range(1,5):
#构造一个双重循环设置的URL,爬取20年的数据,由于是到2020年,所有循环要到2021,循环是前闭后开的,这个要注意。并且数字要转换成字符串类型,不然不能相加
url="http://quotes.money.163.com/trade/lsjysj_600887.html?year="+str(i)+"&season="+str(j)
driver.get(url) #获取网页
time.sleep(1)
for stock in spider(count): #调用spider()这个函数,并且勇于循环中
stoc_d=pd.DataFrame(columns=stock)
stoc_d.to_csv("伊利股票1.csv",mode='a',index=False,encoding='ANSI')
print("保存成功data")
except:
print("已经到最后一天了")
end=time.perf_counter() #运行完了,打印总共需要多少时间
print("20年耗时间:",end-start,"秒")
运行效果