最近在学习优达学院的一门机器学习的课程,主要讲解利用机器学习分析股票数据,然后。课程网址在这里:https://classroom.udacity.com/courses/ud501
所以需要大量的股票数据,我就先百度了一下,发现网易财经的数据很全,暴露的也很好,所以的数据都是放在一个<table>标签中,
所以我就决定爬网易财经了,开始着手写爬虫。
首先,是构造url。
假如我要查询中国石油(601857)的2016年度的第三季度的交易数据,url是这样的。
http://quotes.money.163.com/trade/lsjysj_601857.html?year=2016&season=3
我们发现,这段url有3个参数,股票的代码601857,年度2016,季度3
只要把这三个参数,当作函数的参数传进去,就可以获取到所有股票的所有的交易记录了,
当然,我们暂时就先爬一只股票的所有交易记录就可以了。
因为是每一个年度的每一个季度有不同的url,
所以我们先开始写,爬取单个年度的单个季度的爬虫,之后再进行循环。
def sharesCrawl(shareCode,year,season):三个参数,股票代码,年度,季度
data = requests.get(url, headers=headers) soup = BeautifulSoup(data.text, 'lxml') table = soup.findAll('table',{'class':'table_bg001'})[0] rows = table.findAll('tr')构造完url,就开始进行常规的BeautifulSoup+requests爬虫的编写了,
通过get请求url啊,再构造个head请求头过去。
得到soup之后,找到table啊。再找到除去thead的rows,放进一个list中,方便以后的处理。
但是因为得到的rows是由新到旧的,而我们之后的构造所有的年度是由旧到新的。
所以还得对rows进行一下处理,倒序一下在返回
return rows[::-1]
这样爬虫的大致主体就写完了,之后开始写循环调用上面爬虫的函数,顺便写进csv文件。
def writeCSV(shareCode,beginYear,endYear):也是三个参数:股票代码,起始年,结束年。
首先先打开以股票代码为名字的csv
csvFile = open('./data/' + shareCodeStr + '.csv', 'wb')
writer = csv.writer(csvFile) writer.writerow(('日期','开盘价','最高价','最低价','收盘价','涨跌额','涨跌幅','成交量','成交金额','振幅','换手率'))
再写进第一行。
之后就可以循环调用我们的sharesCrawl函数了。
for i in range(beginYear, endYear + 1):
print str(i) + ' is going'
time.sleep(4)
for j in range(1, 5):
rows = sharesCrawl(shareCode,i,j)
for row in rows:
csvRow = []
# 判断是否有数据
if row.findAll('td') != []:
for cell in row.findAll('td'):
csvRow.append(cell.get_text().replace(',',''))
if csvRow != []:
writer.writerow(csvRow)
time.sleep(3)
print str(i) + '年' + str(j) + '季度is done'
不要吐槽有四层循环,中间的循环季度可以优化,因为季度是1234是固定的。
别的三层就很难被优化了。优化的话,之前的函数soup.find需要重新调整思路。
第一层:循环起始年到截至年,第二层,循环季度1234,
第三层,还记得我们的rows返回的是个tags list吗,循环每一个tag
第四层,获取到了每一行的数据,循环出每一行的每一个数据,放在一个csvRow中,以便写入csv中。
writer.writerow(csvRow)就是将刚才的存放每一个数据的list写入csv文件。
这样就大功告成了,是不是特别简单呢。
所有的代码我已经在github上开源:https://github.com/Yangzhedi/pythonSpider/tree/master/by-bs4/stock,欢迎大家star,fork哈~~~~