Python培训
美国上市Python培训机构

400-111-8989

热门课程

Python爬虫之申万指数抓取

  • 发布: 汪晓平
  • 来源: 旷野牧牛
  • 时间:2018-05-22 18:23

目标

前面两篇爬虫文章中提到的网页数据,通过右键查看源代码,都是可以在网页源代码中看到相关数据的。但也有一些情况是看不到的,比如申万指数中的数据,http://www.swsindex.com/idx0120.aspx?columnid=8832,显示出下图红色表格数据。但右键查看源码中完全找不到相关数据。本文程序就是要赚取这类数据。

Python爬虫之申万指数抓取

数据源分析

网页地址:http://www.swsindex.com/idx0120.aspx?columnid=8832

(1)用Chrome浏览网页。

空白处右键,选择“Inspect”,会跳出监视框。 在监视框中,用鼠标选择箭头可以找到目标数据表格所对应的代码区域。此处对应为

Python爬虫之申万指数抓取

空白处右键,选择“view page source”。在跳出的网页代码中,搜索前面查到的关键词“tablec”。可以发现,出了表格的标题信息以外,所有具体指数信息都不在网页代码中出现。也就意味着:(1)直接读取网页代码进行抓取是抓取不到任何信息的;(2)既然数据在网页中显示了,就网页一定加载了指定页面的数据,只有找到这个指定页面的信息以及访问方式,就可以对这些二次加载的数据进行抓取。

Python爬虫之申万指数抓取

(2)监视中,选择“Network”,然后刷新页面。

在这些network对象中,可以找到最好一个“handler.aspx”,就对应于表格中的数据。

Python爬虫之申万指数抓取

(3)找到目标数据及来源结构。

点击“handler.aspx”,选择右侧上边框中的“Preview”,就可以看到具体的数据,正式希望抓取的数据。

Python爬虫之申万指数抓取

点击“handler.aspx”,选择右侧上边框中的“Headers”,就可以数据来源,以及抓取该数据所需的全部信息。

Python爬虫之申万指数抓取

(4)抓取分析

至此,需要收集的信息出处都有了(上图中绿色框),接下来是如何用python程序实现抓取了。

地址,见第一个框

URL = ‘http://www.swsindex.com/handler.aspx’

浏览器模拟,这个是通用型,可以固定使用。

req_headers= {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding': 'none', 'Accept-Language': 'en-US,en;q=0.8', 'Connection': 'keep-alive'}

见第三个框,交互表单填写

values = {'tablename':'swzs', 'key':'L1', 'p':1, 'where':"L1 in('801010','801020','801030','801040','801050', '801060','801070','801080','801090','801100','801110','801120', '801130','801140','801150','801160','801170','801180','801190', '801200','801210','801220','801230','801710','801720','801730', '801740','801750','801760','801770','801780','801790','801880', '801890')", 'orderby':'', 'fieldlist':'L1,L2,L3,L4,L5,L6,L7,L8,L11', 'pagecount':'28', 'timed':time.time() }

爬虫程序

运行环境:Win10系统;Python 3.0;Sublime Text编辑;

# 库文件引用 import requests import lxml.html from lxml import etree from pandas.io.html import read_html from pandas.compat import StringIO from scipy.optimize import curve_fit import urllib from urllib.request import urlopen, Request import re import json import time # 浏览器头文件 URL_HDR = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding': 'none', 'Accept-Language': 'en-US,en;q=0.8', 'Connection': 'keep-alive'} # 基础函数 def XHR(URL,values,req_headers = URL_HDR,encoding='utf-8'): data = urllib.parse.urlencode(values) data = data.encode(encoding) req = Request(url, data, req_headers) response = urlopen(req) text = response.read() text = text.decode(encoding) return text def FormData(tablename,key,p,where,ordeby,fieldlist,pagecount,timed=None): values = { 'tablename':tablename, 'key':key, 'p':p, 'where':where, 'orderby':ordeby, 'fieldlist':fieldlist, 'pagecount':pagecount, 'timed':time.time() } return values # 本案例的参数 url = 'http://www.swsindex.com/handler.aspx' values = FormData('swzs','L1',1,"L1 in('801010','801020','801030','801040','801050','801060','801070','801080','801090','801100','801110','801120','801130','801140','801150','801160','801170','801180','801190','801200','801210','801220','801230','801710','801720','801730','801740','801750','801760','801770','801780','801790','801880','801890')",'','L1,L2,L3,L4,L5,L6,L7,L8,L11','28') text = XHR(url,values) print(text)

抓取结果:

{'root':[{'L1':'801010','L2':'农林牧渔 ','L3':'2808.21','L4':'2811.07','L5':'9799939222.00','L6':'2816.86','L7':'2795.17','L8':'2806.87','L11':'955979549'},{'L1':'801020','L2':'采掘

案例2:

案例2参数

url = 'http://www.swsindex.com/handler.aspx'; values = FormData('SwIndexInfo','id',1,"IndexType in('量化策略','市场表征','风格指数','特征指数','一级行业','定制发布','申万商品期货指数')",'swindexcode_0','SwIndexCode,SwIndexName,createlinkurltime','79') text = XHR(url,values) print(text)

抓取结果:

{'root':[{'SwIndexCode':'801001','SwIndexName':'申万50','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801002','SwIndexName':'申万中小板','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801003','SwIndexName':'申万A指','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801005','SwIndexName':'申万创业板','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801010','SwIndexName':'农林牧渔','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801020','SwIndexName':'采掘','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801030','SwIndexName':'化工','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801040','SwIndexName':'黑色金属','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801050','SwIndexName':'有色金属','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801060','SwIndexName':'建筑建材','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801070','SwIndexName':'机械设备','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801080','SwIndexName':'电子元器件','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801090','SwIndexName':'交运设备','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801100','SwIndexName':'信息设备','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801110','SwIndexName':'家用电器','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801120','SwIndexName':'食品饮料','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801130','SwIndexName':'纺织服装','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801140','SwIndexName':'轻工制造','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801150','SwIndexName':'医药生物','createlinkurltime':'2017/8/1 0:00:00'},{'SwIndexCode':'801160','SwIndexName':'公用事业','createlinkurltime':'2017/8/1 0:00:00'}]}

小结

本文程序解决在源代码中查看不到的数据抓取,也可称为POST-XHR数据抓取。这种数据抓取可能是最为普遍的方式。通过目前的3篇python爬虫介绍,基本可以满足个人对股票、房产、电影、餐饮等等数据的爬取需求。

还有一类数据抓取,比较的麻烦。例如申万提供的指数历史数据,http://www.swsindex.com/idx0510.aspx,如下图。该数据的抓取需要调用浏览器,并模拟鼠标点击动作,才能抓取。在下一篇,或有需要再写文章说这个。

预约申请免费试听课

上一篇:Python培训课程:如何快速入门?
下一篇:python虚拟环境安装和配置

Python基础语法——条件控制以及循环语句

Python爬虫之申万指数抓取

选择城市和中心
贵州省

广西省

海南省