关键词:爬虫、python、request、接口、excel处理、正则

思路:

1、首先准备好excel文档,把股票代码事先编辑进去。

2、脚本读取文档,依次读出股票代码到指定站点发起请求获取股票信息

3、将获取的股票信息简单处理,依次写入到指定的文档单元格中,完成整个实例过程

用到的python库:xlrd(读取excel)、requests(获取网页数据)、lxml(处理网页数据)、openpyyxl(对excel进行写入编辑)、re(正则)

具体步骤:

一,导入相关库

import xlrd  #引入读取excel库
import requests #倒入requests库
from lxml import etree #倒入lxml 库(没有这个库,pip install lxml安装)
import os
import sys
import openpyxl
import re

二,读取excel内的股票代码,写入数组(共后面的函数调用)

#读取excel文档内的股票代码
def code():
wb = xlrd.open_workbook(path+'\\stock.xlsx')# 打开Excel文件
data = wb.sheet_by_name('Sheet1')#通过excel表格名称(rank)获取工作表
b=data.col_values(0)#获取第一列数据(数组)
list=[]
for c in b[1:]:#for循环,排除第一行数据
d=int(c)
s="%06d" % d#股票代码一共有6位,常规打印无法打印出首位带0的代码的0部分,补齐缺失的0
#print(s)
list.append(s)
return(list)
code=code()

三、循环读取股票代码查询股票信息,写入同一类数据的数组内(共后面写入excel)

#code函数获取的代码,循环爬取代码对应的股票数据,将股票数据写入对应的数组(同一类)中
def get(code):
list_name=[]#股票名称
list_score=[]#综合评分
list_Short=[]#短期趋势
list_Metaphase=[]#中期趋势
list_Long=[]#长期趋势
list_comprehensive=[]#综合评判
list_day=[]#5日涨幅
list_mouth=[]#3个月涨幅
list_year=[]#1年涨幅
for num in code:
url='http://stockpage.10jqka.com.cn/'+num+'/'
headers = {
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Upgrade-Insecure-Requests': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Referer': 'http://doctor.10jqka.com.cn/603160/',
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
} response = requests.get(url, headers=headers).text
html = etree.HTML(response)
b = html.xpath('//h1[@class = "m_logo fl"]/a/strong/text()')
#print(b[0])#股票名称
c = html.xpath('//span[@class = "analyze-tips mt7"]/text()')
#print(c[0])#综合评分
d = html.xpath('//div[@class = "analyze-txt fr"]/div/div[2]/text()')
#print("短期趋势:",d[0])#短期趋势
e = html.xpath('//div[@class = "analyze-txt fr"]/div[2]/div[2]/text()')
#print("中期趋势:",e[0])#中期趋势
f = html.xpath('//div[@class = "analyze-txt fr"]/div[3]/div[2]/text()')
#print("远期趋势:",f[0])#远期趋势
g = html.xpath('//div[@class = "txt-phra"]/text()')
h = html.xpath('//div[@class = "txt-phra"]/strong/text()')
i = html.xpath('//div[@class = "txt-phra"]/text()[2]')
#print(g[0],h[0],i[0])#综合评判
m=g[0]+h[0]+i[0]
#j = html.xpath('//tr[@class = "even hot_cont"]/td[2]/text()')
#k = html.xpath('//tr[@class = "even hot_cont"]/td[3]/text()')
#l = html.xpath('//tr[@class = "even hot_cont"]/td[4]/text()')
tr_content = re.findall('<tr class="even hot_cont">(.*?)</tr', response, re.S)[0]
td_content = re.findall('<td.*?>(.*?)</td', tr_content, re.S)#正则获取周期涨幅
#print("5日涨幅:",j[0])#5日涨幅
#print("3个月涨幅:",k[0])#3个月涨幅
#print("1年涨幅:",l[0])#1年涨幅
list_name.append(b[0])#股票名称数组
list_score.append(c[0])#综合评分
list_Short.append(d[0])#短期趋势
list_Metaphase.append(e[0])#中期趋势
list_Long.append(f[0])#长期趋势
list_comprehensive.append(m)#综合评判
list_day.append(td_content[1])#5日涨幅
list_mouth.append(td_content[2])#3个月涨幅
list_year.append(td_content[3])#1年涨幅 return(list_name,list_score,list_Short,list_Metaphase,
list_Long,list_comprehensive,list_day,list_mouth,list_year)
get=get(code)

四、将写入数组的股票数据,依次写入到对应股票代码后的单元格中

#读取get函数生成的股票数据,依次写入到excel文档中
xfile = openpyxl.load_workbook(path+'\\stock.xlsx')#加载文件
sheet1 = xfile.worksheets[0]
#excel中单元格为B2开始,即第2列,第2行
for i in range(len(get[0])):#股票名称
sheet1.cell(i+2, 2).value=get[0][i] for i in range(len(baidu[0])):#当前价格
sheet1.cell(i+2, 3).value=baidu[0][i] for i in range(len(baidu[1])):#当前市值
sheet1.cell(i+2, 4).value=baidu[1][i] for i in range(len(get[1])):#综合评分
sheet1.cell(i+2, 5).value=get[1][i] for i in range(len(get[2])):#短期趋势
sheet1.cell(i+2, 6).value=get[2][i] for i in range(len(get[3])):#中期趋势
sheet1.cell(i+2, 7).value=get[3][i] for i in range(len(get[4])):#长期趋势
sheet1.cell(i+2, 8).value=get[4][i] for i in range(len(get[5])):#综合评判
sheet1.cell(i+2, 9).value=get[5][i] for i in range(len(get[6])):#5日涨幅
sheet1.cell(i+2, 10).value=get[6][i] for i in range(len(get[7])):#3个月涨幅
sheet1.cell(i+2, 11).value=get[7][i] for i in range(len(get[8])):#1年涨幅
sheet1.cell(i+2, 12).value=get[8][i]
xfile.save(path+'\\stock.xlsx')

直接后的文档内容

全部代码

#本脚本主要实现循环爬取数据后:
# 1、同一类数据统一写入到同一个数组中,
# 2、读取数组数据写入指定的excel列中,实现最终数据爬取
import xlrd #引入读取excel库
import requests #倒入requests库
from lxml import etree #倒入lxml 库(没有这个库,pip install lxml安装)
import os
import sys
import openpyxl
import re path = os.path.abspath(os.path.dirname(sys.argv[0])) #读取excel文档内的股票代码
def code():
wb = xlrd.open_workbook(path+'\\stock.xlsx')# 打开Excel文件
data = wb.sheet_by_name('Sheet1')#通过excel表格名称(rank)获取工作表
b=data.col_values(0)#获取第一列数据(数组)
list=[]
for c in b[1:]:#for循环,排除第一行数据
d=int(c)
s="%06d" % d#股票代码一共有6位,常规打印无法打印出首位带0的代码的0部分,补齐缺失的0
#print(s)
list.append(s)
return(list)
code=code() #code函数获取的代码,循环爬取代码对应的股票数据,将股票数据写入对应的数组(同一类)中
def get(code):
list_name=[]#股票名称
list_score=[]#综合评分
list_Short=[]#短期趋势
list_Metaphase=[]#中期趋势
list_Long=[]#长期趋势
list_comprehensive=[]#综合评判
list_day=[]#5日涨幅
list_mouth=[]#3个月涨幅
list_year=[]#1年涨幅
for num in code:
url='http://stockpage.10jqka.com.cn/'+num+'/'
headers = {
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Upgrade-Insecure-Requests': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Referer': 'http://doctor.10jqka.com.cn/603160/',
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
} response = requests.get(url, headers=headers).text
html = etree.HTML(response)
b = html.xpath('//h1[@class = "m_logo fl"]/a/strong/text()')
#print(b[0])#股票名称
c = html.xpath('//span[@class = "analyze-tips mt7"]/text()')
#print(c[0])#综合评分
d = html.xpath('//div[@class = "analyze-txt fr"]/div/div[2]/text()')
#print("短期趋势:",d[0])#短期趋势
e = html.xpath('//div[@class = "analyze-txt fr"]/div[2]/div[2]/text()')
#print("中期趋势:",e[0])#中期趋势
f = html.xpath('//div[@class = "analyze-txt fr"]/div[3]/div[2]/text()')
#print("远期趋势:",f[0])#远期趋势
g = html.xpath('//div[@class = "txt-phra"]/text()')
h = html.xpath('//div[@class = "txt-phra"]/strong/text()')
i = html.xpath('//div[@class = "txt-phra"]/text()[2]')
#print(g[0],h[0],i[0])#综合评判
m=g[0]+h[0]+i[0]
#j = html.xpath('//tr[@class = "even hot_cont"]/td[2]/text()')
#k = html.xpath('//tr[@class = "even hot_cont"]/td[3]/text()')
#l = html.xpath('//tr[@class = "even hot_cont"]/td[4]/text()')
tr_content = re.findall('<tr class="even hot_cont">(.*?)</tr', response, re.S)[0]
td_content = re.findall('<td.*?>(.*?)</td', tr_content, re.S)#正则获取周期涨幅
#print("5日涨幅:",j[0])#5日涨幅
#print("3个月涨幅:",k[0])#3个月涨幅
#print("1年涨幅:",l[0])#1年涨幅
list_name.append(b[0])#股票名称数组
list_score.append(c[0])#综合评分
list_Short.append(d[0])#短期趋势
list_Metaphase.append(e[0])#中期趋势
list_Long.append(f[0])#长期趋势
list_comprehensive.append(m)#综合评判
list_day.append(td_content[1])#5日涨幅
list_mouth.append(td_content[2])#3个月涨幅
list_year.append(td_content[3])#1年涨幅 return(list_name,list_score,list_Short,list_Metaphase,
list_Long,list_comprehensive,list_day,list_mouth,list_year)
get=get(code) def baidu(code):
list_Price=[]
list_market=[]
for num in code:
cookies = {
'BIDUPSID': '90EF3BD78F53BC8C96DF84CD3854CA2D',
'PSTM': '',
'BD_UPN': '',
'BAIDUID': '885754C8E6BD7B1A771802631815CC6D:FG=1',
'BDORZ': 'B490B5EBF6F3CD402E515D22BCDA1598',
'BDUSS': 'mxYdVpwOEx0eGJsT3VUYTJXbkZJYWhKSGpQWnlqaVBwMlExTWNNRkR4cWtabHRlSVFBQUFBJCQAAAAAAAAAAAEAAACRJsY-cGlwacnxu7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKTZM16k2TNeV',
'COOKIE_SESSION': '7_0_5_3_11_3_0_0_4_2_1_0_73199_0_169_0_1580456363_0_1580456194%7C9%23622712_32_1580376248%7C6',
'cflag': '13%3A3',
'BD_HOME': '',
'BDRCVFR[feWj1Vr5u3D]': 'I67x6TjHwwYf0',
'delPer': '',
'BD_CK_SAM': '',
'PSINO': '',
'H_PS_PSSID': '1438_21104_26350',
'H_PS_645EC': '29b8ZVy4WP7OUTz6%2FjeON9IexqLhOnMXkLTzhD5NfPu4fH%2FPZmThFknleY0LwzNQZ8j8',
'BDSVRTM': '',
'WWW_ST': '',
} headers = {
'is_xhr': '',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
'is_pbs': num,
'Accept': '*/*',
'Referer': 'https://www.baidu.com/s?wd='+num+'&rsv_spt=1&rsv_iqid=0xa5a17c8700013159&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&rsv_dl=tb&oq='+num+'&rsv_t=29b8ZVy4WP7OUTz6%2FjeON9IexqLhOnMXkLTzhD5NfPu4fH%2FPZmThFknleY0LwzNQZ8j8&rsv_pq=b379448d00013935',
'X-Requested-With': 'XMLHttpRequest',
'Connection': 'keep-alive',
'is_referer': 'https://www.baidu.com/s?wd='+num+'&rsv_spt=1&rsv_iqid=0xa5a17c8700013159&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_n=2&rsv_sug3=1&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&inputT=359&rsv_sug4=359',
} params = (
('ie', ['utf-8', 'utf-8']),
('newi', ''),
('mod', ''),
('isbd', ''),
('isid', 'b379448d00013935'),
('wd', num),
('rsv_spt', ''),
('rsv_iqid', '0xa5a17c8700013159'),
('issp', ''),
('f', ''),
('rsv_bp', ''),
('rsv_idx', ''),
('rqlang', 'cn'),
('tn', 'baiduhome_pg'),
('rsv_enter', ''),
('rsv_dl', 'tb'),
('oq', num),
('rsv_t', '29b8ZVy4WP7OUTz6/jeON9IexqLhOnMXkLTzhD5NfPu4fH/PZmThFknleY0LwzNQZ8j8'),
('rsv_pq', 'b379448d00013935'),
('bs', num),
('rsv_sid', '1438_21104_26350'),
('_ss', ''),
('clist', ''),
('hsug', ''),
('f4s', ''),
('csor', ''),
('_cr1', ''),
) response = requests.get('https://www.baidu.com/s', headers=headers, params=params, cookies=cookies).text
html = etree.HTML(response)
a = html.xpath('//span[@class = "op-stockdynamic-moretab-cur-num c-gap-right-small"]/text()')
#print('当前价格:',a[0])#当前价格
b = html.xpath('//ul[@class = "op-stockdynamic-moretab-info"]/li[8]/span[2]/text()')
#print('当前市值:',b[0])#当前市值 list_Price.append(a[0])#当前价格
list_market.append(b[0])#当前市值 return(list_Price,list_market) baidu=baidu(code) #读取get函数生成的股票数据,依次写入到excel文档中
xfile = openpyxl.load_workbook(path+'\\stock.xlsx')#加载文件
sheet1 = xfile.worksheets[0]
#excel中单元格为B2开始,即第2列,第2行
for i in range(len(get[0])):#股票名称
sheet1.cell(i+2, 2).value=get[0][i] for i in range(len(baidu[0])):#当前价格
sheet1.cell(i+2, 3).value=baidu[0][i] for i in range(len(baidu[1])):#当前市值
sheet1.cell(i+2, 4).value=baidu[1][i] for i in range(len(get[1])):#综合评分
sheet1.cell(i+2, 5).value=get[1][i] for i in range(len(get[2])):#短期趋势
sheet1.cell(i+2, 6).value=get[2][i] for i in range(len(get[3])):#中期趋势
sheet1.cell(i+2, 7).value=get[3][i] for i in range(len(get[4])):#长期趋势
sheet1.cell(i+2, 8).value=get[4][i] for i in range(len(get[5])):#综合评判
sheet1.cell(i+2, 9).value=get[5][i] for i in range(len(get[6])):#5日涨幅
sheet1.cell(i+2, 10).value=get[6][i] for i in range(len(get[7])):#3个月涨幅
sheet1.cell(i+2, 11).value=get[7][i] for i in range(len(get[8])):#1年涨幅
sheet1.cell(i+2, 12).value=get[8][i]
xfile.save(path+'\\stock.xlsx') print("爬取完成")
 
 

python实例:从excel读取股票代码,爬取股票信息写到代码后面的单元格中的更多相关文章

  1. 小白学 Python 爬虫(25):爬取股票信息

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  2. Python爬虫学习(6): 爬取MM图片

    为了有趣我们今天就主要去爬取以下MM的图片,并将其按名保存在本地.要爬取的网站为: 大秀台模特网 1. 分析网站 进入官网后我们发现有很多分类: 而我们要爬取的模特中的女模内容,点进入之后其网址为:h ...

  3. python爬取网页的通用代码框架

    python爬取网页的通用代码框架: def getHTMLText(url):#参数code缺省值为‘utf-8’(编码方式) try: r=requests.get(url,timeout=30) ...

  4. Python爬取招聘信息,并且存储到MySQL数据库中

    前面一篇文章主要讲述,如何通过Python爬取招聘信息,且爬取的日期为前一天的,同时将爬取的内容保存到数据库中:这篇文章主要讲述如何将python文件压缩成exe可执行文件,供后面的操作. 这系列文章 ...

  5. Python——初识网络爬虫(网页爬取)

    网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫 ...

  6. Python爬虫学习三------requests+BeautifulSoup爬取简单网页

    第一次第一次用MarkDown来写博客,先试试效果吧! 昨天2018俄罗斯世界杯拉开了大幕,作为一个伪球迷,当然也得为世界杯做出一点贡献啦. 于是今天就编写了一个爬虫程序将腾讯新闻下世界杯专题的相关新 ...

  7. 初识python 之 爬虫:使用正则表达式爬取“糗事百科 - 文字版”网页数据

    初识python 之 爬虫:使用正则表达式爬取"古诗文"网页数据 的兄弟篇. 详细代码如下: #!/user/bin env python # author:Simple-Sir ...

  8. python爬虫---实现项目(一) Requests爬取HTML信息

    上面的博客把基本的HTML解析库已经说完了,这次我们来给予几个实战的项目. 这次主要用Requests库+正则表达式来解析HTML. 项目一:爬取猫眼电影TOP100信息 代码地址:https://g ...

  9. python爬虫构建代理ip池抓取数据库的示例代码

    爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...

随机推荐

  1. CentOS 7防火墙

    CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤. 1.关闭firewall: systemctl stop firewalld.service #停止f ...

  2. 35.python之事件驱动模型

    转载:https://www.cnblogs.com/yuanchenqi/articles/5722574.html 事件驱动模型 上节的问题: 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么 ...

  3. hadoop中 namenode的持久化

    一.为什么namenode持久化 namenode通过内存存储hdfs集群的元数据(目录结构 文件信息 块对应关系),如果内存出现问题,那么会数据丢失,需要通过持久化,把内存中的数据定期的存储在硬盘中 ...

  4. 【软帝学院】女生不适合学习java?其实女生学java更有优势,更好就业!

    女生适合学java吗?女生做IT怎么样 首先要表明我的观点,编程是不分男女,什么女生不适合学编程的说法,从客观上来说,我觉得这是一种偏见. 不少人潜意识里认为女生不适合从事IT开发岗位的工作,因为他们 ...

  5. Rust入坑指南:亡羊补牢

    如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大.它可以帮助你避免程序中的大部分错误,但是编译器也不是万能的,如果程序写的不恰当,还是会发生错误,让程序崩溃.所以今天我们就来聊一聊Ru ...

  6. 优雅的使用 ThreadLocal

    前言 在我们日常 Java Web 开发中难免遇到需要把一个参数层层的传递到最内层,然后中间层根本不需要使用这个参数,或者是仅仅在特定的工具类中使用,这样我们完全没有必要在每一个方法里面都传递这样一个 ...

  7. $Noip2013/Luogu1970$ 花匠 $dp$+思维

    $Luogu$ $Sol$ 和$Poj1037\ A\ Decorative\ Fence$好像吖. $f[i][0/1]$表示前$i$个数,且选了第$i$个数,这个数相对于上一个数是下降(上升)的, ...

  8. $Poj2054\ Color\ a\ Tree\ $ 贪心

    $poj$ $Description$ 一颗树有 $n$ 个节点,这些节点被标号为:$1,2,3…n,$每个节点 $i$ 都有一个权值 $A[i]$. 现在要把这棵树的节点全部染色,染色的规则是: 根 ...

  9. 洛谷P5664 Emiya 家今天的饭 题解 动态规划

    首先来看一道题题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 ...

  10. springmvc接收json数据的常见方式

    经常使用Ajax异步请求来进行数据传输,传的数据是json数据,json数据又有对象,数组.所有总结下springmvc获取前端传来的json数据方式:1.以RequestParam接收前端传来的是j ...