利用bs4和requests爬取股票历史交易数据

最近在学习优达学院的一门机器学习的课程,主要讲解利用机器学习分析股票数据,然后。课程网址在这里:https://classroom.udacity.com/courses/ud501

所以需要大量的股票数据,我就先百度了一下,发现网易财经的数据很全,暴露的也很好,所以的数据都是放在一个

标签中,

利用bs4和requests爬取股票历史交易数据_第1张图片

所以我就决定爬网易财经了,开始着手写爬虫。

首先,是构造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哈~~~~




你可能感兴趣的:(python)