需求:爬取“理财大视野”网站的排名、代码、名称、市净率、市盈率等信息,并分别写入txt、excel和mysql
环境:python3.6.5
网站:http://www.dashiyetouzi.com/tools/value/Graham.php
查看html源码:信息在html中以table形式存在,每个股票信息是一行,存放在tr中,单元格信息存放在td中
因此思路为:通过id或者class查找table→查找tr→查找td
第三方库
from bs4 import BeautifulSoup
from urllib import request
import time
import xlrd
import xlwt
import pymysql
获取html源码
url = "http://www.dashiyetouzi.com/tools/value/Graham.php"
htmlData = request.urlopen(url).read().decode('utf-8')
soup = BeautifulSoup(htmlData, 'lxml')
#print(soup.prettify())
allData = soup.find("table", {'class': 'datatable'})
遍历表格中的每一行进行查找
for tr in allData.find_all('tr'):
eachData = tr.find_all('td')
#print(eachData)
rank = eachData[0].string#排名
code = eachData[1].find('a').string#代码
name = eachData[2].find('a').string#名称
industry = eachData[3].string#行业
PE = eachData[6].string#市净率
PBV = eachData[7].string#市盈率
#返回类型不一样,get_text()返回的是字符串,末尾有空格。需要先去掉末尾的空格,再去掉百分号
GXL = eachData[-1].get_text().rstrip().strip('%')#股息率
股息率用string取的类型不是字符串,无法进行后续操作
将股息率大于4的结果保存成一位数组形式allIms。
同时写入txt文档,本次写入的方式是生成一个股票信息info立马写入(无需整合成数组eachIms),而不是最后整体写入,因此直接写到循环里面了
if float(GXL) > 4:
# 写入txt文件,循环写入
info = "排名:" + rank + ",代码:" + code + ",股票名称:" + name + ",所属行业:" + industry + ",市盈率:" + PE + ",市净率:" + PBV + ",股息率:" + GXL +'\n'
#print(info,type(info))
txtFile.writelines(info) eachIms = [rank,code,name,industry,PE,PBV,GXL]
allIms.append(eachIms)
#print(eachIms) #print(allIms)
txtFile.close()
输出结果:
写入excel,python对excel支持的一版,插件对excel版本的支持也略有差别,本次采用xls这个格式,此次无法写覆盖
写入方法就是按照行坐标、列坐标循环写入
#写入excel文件,数据以二维数组的形式存放于allIms中,无法写覆盖
workbook = xlwt.Workbook(encoding='utf-8')# 创建工作簿
# 创建sheet
data_sheet = workbook.add_sheet('格雷厄姆选股票1')#表单的名字而不是excel文件名
title = ['排名','代码','股票名称','所属行业','市盈率','市净率','股息率']
for j in range(len(title)):#先写入标题行
data_sheet.write(0, j, title[j])
#print(len(allIms),len(title)) for i in range(len(allIms)):#i表示行数
for j in range(len(title)):#j表示列数
data_sheet.write(i+1,j, allIms[i][j])#行坐标、列坐标、数据 workbook.save('格雷厄姆选股票1.xls')#文件名
输出结果:
写入数据库mysql,首先在mysql中新建一个库graham,然后测试python与mysql连通性,这里采用返回数据库版本的形式验证
#测试与mysql中的graham库的连通性
import pymysql
db= pymysql.connect(host='127.0.0.1',port=3306,user='root',password='',database='graham',charset='utf8')
cur= db.cursor()#SQLServer的游标
cur.execute("SELECT VERSION()")
data = cur.fetchone()#读一行
print(data)
可以在数据库中创建表单,也可在python中创建,这里我直接在navicat中创建了,python只是写入具体数据
#写入数据库mysql,数据以二维数组的形式存放于allIms中
#提前新建数据graham和字段,字段属性需要与eachIms中的各个属性一致(本程序中均为字符串)
db= pymysql.connect(host='127.0.0.1',port=3306,user='root',password='',database='graham',charset='utf8')
cur= db.cursor()#SQLServer的游标
sql="""
INSERT INTO 格雷厄姆选股票1(排名,代码, 股票名称, 所属行业, 市盈率,市净率,股息率)
VALUES (%s,%s,%s,%s,%s,%s,%s)
"""
for i in allIms:
cur.execute(sql,i)#执行数据库相应的语句
db.commit()
db.close()
输出结果:
源代码:
"""
通过理财大视野,获取股票的名称、代码、行业、市净率、市盈率、股息率
并将股息率大于4%的结果分别写入txt、excel和mysql
""" from bs4 import BeautifulSoup
from urllib import request
import time
import xlrd
import xlwt
import pymysql url = "http://www.dashiyetouzi.com/tools/value/Graham.php"
htmlData = request.urlopen(url).read().decode('utf-8')
soup = BeautifulSoup(htmlData, 'lxml')
#print(soup.prettify())
allData = soup.find("table", {'class': 'datatable'}) time = time.strftime('%Y_%m_%d', time.localtime(time.time()))#获取当前时间年_月_日
filename = "Graham_" + time # Graham格雷厄姆
txtFile = open(filename + ".txt", 'w')
allIms = []
for tr in allData.find_all('tr'):
#eachData是每一行信息(一位数组)
eachData = tr.find_all('td')
#print(eachData)
rank = eachData[0].string#排名
code = eachData[1].find('a').string#代码
name = eachData[2].find('a').string#名称
industry = eachData[3].string#行业
PE = eachData[6].string#市净率
PBV = eachData[7].string#市盈率
#返回类型不一样,get_text()返回的是字符串,末尾有空格。需要先去掉末尾的空格,再去掉百分号
GXL = eachData[-1].get_text().rstrip().strip('%')#股息率 if float(GXL) > 4:
# 写入txt文件,循环写入
info = "排名:" + rank + ",代码:" + code + ",股票名称:" + name + ",所属行业:" + industry + ",市盈率:" + PE + ",市净率:" + PBV + ",股息率:" + GXL +'\n'
#print(info,type(info))
txtFile.writelines(info) eachIms = [rank,code,name,industry,PE,PBV,GXL]#每条股票信息,一位数组
allIms.append(eachIms)#所有股票信息,二维数组通过append()整合
#print(eachIms)
print(allIms)
txtFile.close() #写入excel文件,数据以二维数组的形式存放于allIms中,无法写覆盖
workbook = xlwt.Workbook(encoding='utf-8')# 创建工作簿
# 创建sheet
data_sheet = workbook.add_sheet('格雷厄姆选股票1')#表单的名字而不是excel文件名
title = ['排名','代码','股票名称','所属行业','市盈率','市净率','股息率']
for j in range(len(title)):#先写入标题行
data_sheet.write(0, j, title[j])
#print(len(allIms),len(title)) for i in range(len(allIms)):#i表示行数
for j in range(len(title)):#j表示列数
data_sheet.write(i+1,j, allIms[i][j])#行坐标、列坐标、数据 workbook.save('格雷厄姆选股票1.xls')#文件名 #写入数据库mysql,数据以二维数组的形式存放于allIms中
#提前新建数据graham和字段,字段属性需要与eachIms中的各个属性一致(本程序中均为字符串)
db= pymysql.connect(host='127.0.0.1',port=3306,user='root',password='',database='graham',charset='utf8')
cur= db.cursor()#SQLServer的游标
sql="""
INSERT INTO 格雷厄姆选股票1(排名,代码, 股票名称, 所属行业, 市盈率,市净率,股息率)
VALUES (%s,%s,%s,%s,%s,%s,%s)
"""
for i in allIms:
cur.execute(sql,i)#执行数据库相应的语句
db.commit()
db.close()