人生苦短,我用 Python

如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对

前文传送门:

如何用php获取股票小白学 Python 爬虫25爬取股票信息 Angular

小白学 Python 爬虫(1):开篇

小白学 Python 爬虫(2):前置准备(一)基本类库的安装

小白学 Python 爬虫(3):前置准备(二)Linux根本入门

小白学 Python 爬虫(4):前置准备(三)Docker根本入门

小白学 Python 爬虫(5):前置准备(四)数据库根本

小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装

小白学 Python 爬虫(7):HTTP 根本

小白学 Python 爬虫(8):网页根本

小白学 Python 爬虫(9):爬虫根本

小白学 Python 爬虫(10):Session 和 Cookies

小白学 Python 爬虫(11):urllib 根本利用(一)

小白学 Python 爬虫(12):urllib 根本利用(二)

小白学 Python 爬虫(13):urllib 根本利用(三)

小白学 Python 爬虫(14):urllib 根本利用(四)

小白学 Python 爬虫(15):urllib 根本利用(五)

小白学 Python 爬虫(16):urllib 实战之爬取妹子图

小白学 Python 爬虫(17):Requests 根本利用

小白学 Python 爬虫(18):Requests 进阶操作

小白学 Python 爬虫(19):Xpath 基操

小白学 Python 爬虫(20):Xpath 进阶

小白学 Python 爬虫(21):解析库 Beautiful Soup(上)

小白学 Python 爬虫(22):解析库 Beautiful Soup(下)

小白学 Python 爬虫(23):解析库 pyquery 入门

小白学 Python 爬虫(24):2019 豆瓣电影排行

弁言

上一篇的实战写到末了没有用到页面元素解析,觉得有点小遗憾,不过末了的电影列表还是挺喷鼻香的,真的推举一看。

本次选题是先写好代码再写的文章,绝对可以用到页面元素解析,并且还须要对网站的数据加载有一定的剖析,才能得到终极的数据,并且

郑重声明: 本文仅用于学习等目的。

剖析

首先要爬取股票数据,肯定要先知道有哪些股票吧,这里

打开 Chrome 的开拓者模式,将股票代码一个一个选出来吧。
详细过程

我们可以将所有的股票代码存放在一个列表中,剩下的便是找一个网站,循环的去将每一只股票的数据取出来咯。

这个网站

想必各位聪明的同学已经创造了,这个链接中的 000001 便是股票代码。

我们接下来只须要拼接这个链接,就能源源不断的获取到我们想要的数据。

实战

首先,还是先先容一下本次实战用到的要求库和解析库为: Requests 和 pyquery 。
数据存储末了还是落地在 Mysql 。

获取股票代码列表

第一步当然是先构建股票代码列表咯,我们先定义一个方法:

def get_stock_list(stockListURL): r =requests.get(stockListURL, headers = headers) doc = PyQuery(r.text) list = [] # 获取所有 section 中 a 节点,并进行迭代 for i in doc('.stockTable a').items(): try: href = i.attr.href list.append(re.findall(r"\d{6}", href)[0]) except: continue list = [item.lower() for item in list] # 将爬取信息转换小写 return list

将上面的链接当做参数传入,大家可以自己运行下看下结果,

http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code=000001

至于是怎么找出来,

现在数据接口有了,我们先看下返回的数据吧:

showStockDate({"info":{"000001":{"name":"\u5e73\u5b89\u94f6\u884c"}},"data":{"000001":{"10":"16.13","8":"16.14","9":"15.87","13":"78795234.00","19":"1262802470.00","7":"16.12","15":"40225508.00","14":"37528826.00","69":"17.73","70":"14.51","12":"5","17":"945400.00","264648":"0.010","199112":"0.062","1968584":"0.406","2034120":"9.939","1378761":"16.026","526792":"1.675","395720":"-948073.000","461256":"-39.763","3475914":"313014790000.000","1771976":"1.100","6":"16.12","11":""}}})

很明显,这个结果并不是标准的 json 数据,但这个是 JSONP 返回的标准格式的数据,这里我们先处理下头尾,将它变成一个标准的 json 数据,再对照这页面的数据进行解析,末了将剖析好的值写入数据库中。

def getStockInfo(list, stockInfoURL): count = 0 for stock in list: try: url = stockInfoURL + stock r = requests.get(url, headers=headers) # 将获取到的数据封装进字典 dict1 = json.loads(r.text[14: int(len(r.text)) - 1]) print(dict1) # 获取字典中的数据构建写入数据模版 insert_data = { "code": stock, "name": dict1['info'][stock]['name'], "jinkai": dict1['data'][stock]['7'], "chengjiaoliang": dict1['data'][stock]['13'], "zhenfu": dict1['data'][stock]['526792'], "zuigao": dict1['data'][stock]['8'], "chengjiaoe": dict1['data'][stock]['19'], "huanshou": dict1['data'][stock]['1968584'], "zuidi": dict1['data'][stock]['9'], "zuoshou": dict1['data'][stock]['6'], "liutongshizhi": dict1['data'][stock]['3475914'] } cursor.execute(sql_insert, insert_data) conn.commit() print(stock, ':写入完成') except: print('写入非常') # 碰着缺点连续循环 continue

这里我们加入非常处理,由于本次爬取的数据有些多,很有可能由于某些缘故原由抛出非常,我们当然不肯望有非常的时候中断数据抓取,以是这里添加非常处理连续抓取数据。

完全代码

我们将代码稍作封装,完本钱次的实战。

import requestsimport reimport jsonfrom pyquery import PyQueryimport pymysql# 数据库连接def connect(): conn = pymysql.connect(host='localhost', port=3306, user='root', password='password', database='test', charset='utf8mb4') # 获取操作游标 cursor = conn.cursor() return {"conn": conn, "cursor": cursor}connection = connect()conn, cursor = connection['conn'], connection['cursor']sql_insert = "insert into stock(code, name, jinkai, chengjiaoliang, zhenfu, zuigao, chengjiaoe, huanshou, zuidi, zuoshou, liutongshizhi, create_date) values (%(code)s, %(name)s, %(jinkai)s, %(chengjiaoliang)s, %(zhenfu)s, %(zuigao)s, %(chengjiaoe)s, %(huanshou)s, %(zuidi)s, %(zuoshou)s, %(liutongshizhi)s, now())"headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}def get_stock_list(stockListURL): r =requests.get(stockListURL, headers = headers) doc = PyQuery(r.text) list = [] # 获取所有 section 中 a 节点,并进行迭代 for i in doc('.stockTable a').items(): try: href = i.attr.href list.append(re.findall(r"\d{6}", href)[0]) except: continue list = [item.lower() for item in list] # 将爬取信息转换小写 return listdef getStockInfo(list, stockInfoURL): count = 0 for stock in list: try: url = stockInfoURL + stock r = requests.get(url, headers=headers) # 将获取到的数据封装进字典 dict1 = json.loads(r.text[14: int(len(r.text)) - 1]) print(dict1) # 获取字典中的数据构建写入数据模版 insert_data = { "code": stock, "name": dict1['info'][stock]['name'], "jinkai": dict1['data'][stock]['7'], "chengjiaoliang": dict1['data'][stock]['13'], "zhenfu": dict1['data'][stock]['526792'], "zuigao": dict1['data'][stock]['8'], "chengjiaoe": dict1['data'][stock]['19'], "huanshou": dict1['data'][stock]['1968584'], "zuidi": dict1['data'][stock]['9'], "zuoshou": dict1['data'][stock]['6'], "liutongshizhi": dict1['data'][stock]['3475914'] } cursor.execute(sql_insert, insert_data) conn.commit() print(stock, ':写入完成') except: print('写入非常') # 碰着缺点连续循环 continuedef main(): stock_list_url = 'https://hq.gucheng.com/gpdmylb.html' stock_info_url = 'http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code=' list = get_stock_list(stock_list_url) # list = ['601766'] getStockInfo(list, stock_info_url)if __name__ == '__main__': main()成果

终极

示例代码-Github

示例代码-Gitee