python爬虫实战:每日采集申万指数之申万一级行业指数数据

什么是申万指数

说到申万指数,我想炒股的人应该都或多或少有了解,在这里重新解释一下:

    申万一级行业指数是由申万研究所指定发布的股票指数。
    理解什么申万一级行业指数,首先要指数什么是申万一级行业。申万研
究所是国内卖方研究机构实力最强的之一。
    他们根据自己的研究方向,划分出申万一级行业、二级行业。国内其它
的证券研究机构觉得申万的行业划分比证监会的行业划分更接近市场,在他
们的研究所里也大都采用申万的行业分类。
    2013年底最新版申万一级行业分类标准设立一级行业28个、二级行业
104个、三级行业227个。
    28个一级行业包括:轻工制造、采掘、传媒、电气设备、电子、国防军
工、计算机、公用事业、非银金融、房地产、交通运输、汽车、建筑装饰、
金融服务、医药生物等。
申万一级行业指数是指申万囊括的一级行业每一行业的指数。
 

爬取申万指数的初衷

做交易、分析师或者其他做宏观研究的人对指数数据都有需求。
公司有同花顺和万德终端,倒是可以很方便的获取到行业数据,但存在一个问题,就是更新速度!前者甚至有时候到晚上才能更新到当日最新数据。还让不让人下班了?!!

于是乎,我在网上找到申万的指数数据来源,每天收盘之后把数据抓下来就好喽~不过申万指数官网除了一级行业指数之外,其他的好像都要有权限才行。


Let'Go! 

言归正传,我们开始。

确定目标所在地


http://www.swsindex.com/idx0120.aspx?columnid=8832


swsindex_index
开发者工具

使用谷歌内核浏览器,打开开发者工具,切换到NetWork网络监控选项卡,
network1

如果当前页面已经是目标页面,F5刷新即可。
或者直接打开网址,Network就可以监控到数据。
network2
从上图中发现,handler.aspx的type是xhr(Xml HttpRequest),那么它极有可能发数据请求的目标。
双击打开看看,切换到header,如下图:
network3
 


Request URL:http://www.swsindex.com/handler.aspx
Request Method:POST

发送了一个post请求到上述地址。

来看看提交的表单内容
 

tablename:swzs
key:L1
p:1     <-这个字段应该是page页码
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:1457410470776   <- 请求的时间戳,不知是否会有time验证

到了这里,就可以结合以前的学的东西喽!

结合urllib2,同时构造Request里的data(dict格式)数据即可得到结果。
requestdata

这里有一点需要注意,构造的data数据需要用urllib.urlencode转码,否则会提示有如下错误提示:
 

# TypeError: must be string or buffer, not dict


到这一步已经相当之详细,代码就不贴了,太占位置。如果有读者需要,可以联系博主。
以下是结果:


{'root':[{'L1':'801010','L2':'农林牧渔                      ','L3':'3041.05','L4':'3030.37','L5':'7365585728.00','L6':'3030.37','L7':'2901.25','L8':'2978.31','L11':'623729297'},{'L1':'801020','L2':'采掘                          ','L3':'3342.66','L4':'3415.65','L5':'13997372201.00','L6':'3420.64','L7':'3296.03','L8':'3334.66','L11':'1809805768'},{'L1':'801030','L2':'化工                          ','L3':'2741.60','L4':'2745.45','L5':'25716670889.00','L6':'2745.46','L7':'2649.84','L8':'2724.56','L11':'2309542526'},{'L1':'801040','L2':'钢铁                          ','L3':'2408.73','L4':'2473.95','L5':'6853041793.00','L6':'2474.67','L7':'2360.88','L8':'2400.50','L11':'1489047125'},{'L1':'801050','L2':'有色金属                      ','L3':'3361.30','L4':'3369.27','L5':'27511664323.00','L6':'3369.27','L7':'3233.79','L8':'3325.93','L11':'2469144099'},{'L1':'801080','L2':'电子                          ','L3':'2562.75','L4':'2551.79','L5':'16305184701.00','L6':'2551.97','L7':'2449.39','L8':'2539.89','L11':'1322819746'},{'L1':'801110','L2':'家用电器                      ','L3':'4112.62','L4':'4108.86','L5':'4380875692.00','L6':'4108.86','L7':'3996.73','L8':'4081.90','L11':'442084649'},{'L1':'801120','L2':'食品饮料                      ','L3':'5978.74','L4':'5964.13','L5':'5097415209.00','L6':'5964.60','L7':'5781.46','L8':'5885.37','L11':'347400564'},{'L1':'801130','L2':'纺织服装                      ','L3':'3159.66','L4':'3148.92','L5':'4979747768.00','L6':'3149.25','L7':'3044.47','L8':'3130.16','L11':'388109877'},{'L1':'801140','L2':'轻工制造                      ','L3':'2914.56','L4':'2907.46','L5':'8181923662.00','L6':'2907.46','L7':'2789.70','L8':'2882.46','L11':'696454422'},{'L1':'801150','L2':'医药生物                      ','L3':'6803.31','L4':'6791.37','L5':'14463228860.00','L6':'6791.84','L7':'6575.43','L8':'6754.49','L11':'849230919'},{'L1':'801160','L2':'公用事业                      ','L3':'2677.69','L4':'2669.72','L5':'7661010239.00','L6':'2669.87','L7':'2582.63','L8':'2633.09','L11':'897752659'},{'L1':'801170','L2':'交通运输                      ','L3':'2696.51','L4':'2696.30','L5':'11956582819.00','L6':'2696.31','L7':'2600.29','L8':'2691.20','L11':'1523154384'},{'L1':'801180','L2':'房地产                        ','L3':'4791.34','L4':'4783.60','L5':'20280637970.00','L6':'4783.60','L7':'4582.15','L8':'4680.66','L11':'2216809398'},{'L1':'801200','L2':'商业贸易                      ','L3':'4452.82','L4':'4454.07','L5':'8799547627.00','L6':'4454.07','L7':'4299.27','L8':'4419.45','L11':'707959552'},{'L1':'801210','L2':'休闲服务                      ','L3':'5400.13','L4':'5387.60','L5':'2256086896.00','L6':'5387.60','L7':'5200.52','L8':'5381.07','L11':'131094394'},{'L1':'801230','L2':'综合                          ','L3':'2906.47','L4':'2897.70','L5':'3964724063.00','L6':'2897.71','L7':'2808.50','L8':'2877.92','L11':'317777052'},{'L1':'801710','L2':'建筑材料                      ','L3':'4524.15','L4':'4537.85','L5':'5235316622.00','L6':'4537.85','L7':'4347.70','L8':'4463.41','L11':'561467495'},{'L1':'801720','L2':'建筑装饰                      ','L3':'2580.56','L4':'2568.96','L5':'7619781089.00','L6':'2569.04','L7':'2474.94','L8':'2528.11','L11':'743404629'},{'L1':'801730','L2':'电气设备                      ','L3':'5094.35','L4':'5087.94','L5':'10418783394.00','L6':'5087.94','L7':'4884.03','L8':'5031.06','L11':'895849307'}]}

评论 (5)
  1. 沙发
    cattleboy 2016-09-27 16:16

    请教一下,http://www.swsindex.com/idx0510.aspx# 这里的每个文件如何抓取?
    参照你的方法,可以获得完整的表格内容,但是后续该如何进行呢?。谢谢

    • 回复
      kingmo888 2016-09-29 06:07
      @cattleboy 要下载文件吗?我看一下。稍后以回复或者新开一贴形式回复你哈。
      • 回复
        cattleboy 2016-09-29 10:58
        @kingmo888 谢谢! 我用浏览器的方式,能够打开到存储文件,测试过csv存储可以不免存储窗口的弹出。但是这个网站,存储的弹出窗口一直关闭不了,就不能自动存储。一种可能是browser.helperApps.neverAsk.saveToDisk里面的参数不对,或许跟网页有关。 参考代码: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.action_chains import ActionChains import requests import os url='http://www.swsindex.com/idx0510.aspx' fp = webdriver.FirefoxProfile() fp.set_preference("browser.download.folderList",2) fp.set_preference("browser.download.dir", os.getcwd()+'\\tmp') fp.set_preference("browser.download.manager.showWhenStarting", False) fp.set_preference("browser.helperApps.alwaysAsk.force", False) fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/x-www-form-urlencoded,application/xls;text/csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,\ application/vnd.ms-excel,text/csv/xls/xlsx,\ text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\ application/Microsoft Excel 97-2003 Worksheet,text/Microsoft Excel 97-2003 Worksheet,\ application/excel,application/x-excel,\ text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream,\ application/x-msexcel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,\ text/plain, application/octet-stream, application/binary, text/xls, text/xlsx,text/csv, application/csv,\ text/comma-separated-values, text/xml, application/xml, text/html,\ text/csv, application/*") fp.set_preference("browser.helperApps.alwaysAsk.force", False) fp.set_preference("browser.download.manager.alertOnEXEOpen", False) fp.set_preference("browser.download.manager.focusWhenStarting", False) fp.set_preference("browser.download.useDownloadDir", True) fp.set_preference("browser.download.manager.alertOnEXEOpen", False) fp.set_preference("browser.download.manager.closeWhenDone", True) fp.set_preference("browser.download.manager.showAlertOnComplete", False) fp.set_preference("browser.download.manager.useWindow", False) browser = webdriver.Firefox(firefox_profile=fp) browser.get(url) links = browser.find_elements_by_partial_link_text('申万A指历史行情') for link in links: print (link.get_attribute("href")) link.click()
      • 回复
        cattleboy 2016-09-29 13:47
        @kingmo888 改成这个就可以了! fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/ms-excel") 但这个方法必须调用浏览器
        • 回复
          kingmo888 2016-09-30 01:57
          @cattleboy 看来你已经解决了哈。 模拟浏览器行为当然会调用浏览器啦。