本文的文字及图片来源于网络,仅供学习、交流使用,不具备任何商业用途,版权归原做者全部,若有问题请及时联系咱们以做处理。php
做者:html
PS:若有须要Python学习资料的小伙伴能够加点击下方连接自行获取python
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cefmysql
本次选题是先写好代码再写的文章,绝对能够用到页面元素解析,而且还须要对网站的数据加载有必定的分析,才能获得最终的数据,而且小编找的这两个数据源无 ip 访问限制,质量有保证,绝对是小白练手的绝佳之选。web
郑重声明: 本文仅用于学习等目的。sql
首先要爬取股票数据,确定要先知道有哪些股票吧,这里小编找到了一个网站,这个网站上有股票的编码列表:https://hq.gucheng.com/gpdmylb.html 。
打开 Chrome 的开发者模式,将股票代码一个一个选出来吧。具体过程小编就不贴了,各位同窗自行实现。数据库
咱们能够将全部的股票代码存放在一个列表中,剩下的就是找一个网站,循环的去将每一只股票的数据取出来咯。json
这个网站小编已经找好了,是同花顺,连接: http://stockpage.10jqka.com.cn/000001/ 。
想必各位聪明的同窗已经发现了,这个连接中的 000001 就是股票代码。网络
咱们接下来只须要拼接这个连接,就能源源不断的获取到咱们想要的数据。app
首先,仍是先介绍一下本次实战用到的请求库和解析库为: 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 requests import re import json from pyquery import PyQuery import 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 list 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 def 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()
最终小编耗时 15 分钟左右,成功抓取数据 4600+ 条,结果就不展现了。