Python爬虫进阶实战四——抓取申万一级行业指数

  • A+
所属分类:Python

Python爬虫进阶实战四——抓取申万一级行业指数 – Python量化投资

博主在很早之前——嗯,大约三年多了——已经写过了抓取申万一级行业指数的文章,本来打算把那篇文章拉到教程中就可以了,可近期有网友在博客留言还是需要这个,那本次我就比较系统的(主要是有源码,哈哈)再重新实现一下这个小爬虫(以前的源码丢了。。哈哈),作为Python3爬虫系列教程的例子之一。

Python3爬虫系列教程传送门:《Python3爬虫教程及可视化数据分析系列图文教程

此前一篇相关文章的地址传送门:《python爬虫实战:每日采集申万指数之申万一级行业指数数据

一、分析目标
基本这个小爬虫,用 requests 模块基本完成需求,当然,可能还用到 json 、 time 模块。
使用此前博文的图片吧,我们分析一下几个要素:
5d352d5eaa62ea11d20001f2_html_.png

  • Request Method: POST   ->提交方式为post
  • 需要构建一个等效Requests Headers
  • 需要构造一个等效的postdata,也就是图中的Form Data
  • 整个一级行业一共28个指数,分为2页,需要请求2次。

二、落实需求
引入前文提到的模块:
1. import requests
2. import time
3. import json
我们按照上面的分析,先构建一个headers:
headers = {
         'Accept': 'application/json, text/javascript, /',
         'Accept-Encoding': 'gzip, deflate',
         'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
         'Cache-Control': 'no-cache',
         'Content-Type': 'application/x-www-form-urlencoded',
         'DNT': '1',
         'Host': 'www.swsindex.com',
         'Origin': 'http://www.swsindex.com',
         'Pragma': 'no-cache',
         'Referer': 'http://www.swsindex.com/idx0120.aspx?columnid=8832',

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',

'X-Requested-With': 'XMLHttpRequest'
             }
然后构建一个postdata:
postdata = {
         'tablename': 'swzs',
         'key': 'L1',
         'p': '1',

'where': "L1 in('801010','801020','801030','801040','801050','801080','801110','801120','801130','801140','801150','801160','801170','801180','801200','801210','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': '{}'.format(int(time.time()*1000))
 }
其中页码p是变量,一共2页。timed也是变量,通过 time.time() 来获取时间戳然后将取值到千分位。
然后就可以愉快的获取数据了:
url = 'http://www.swsindex.com/handler.aspx'
req = requests.post(url, headers=headers, data=postdata)
data =req.content.decode()
可以看到,已经愉快的取到数据了。

5d352d5eaa62ea11d20001f3_html_.png

既然是json数据,咱就直接通过json获取吧:

req.json()
提示错误:JSONDecodeError: Expecting property name enclosed in double quotes

为啥?
因为json解析时,其数据不能是单引号的。所以简单处理下即可:
1. data =req.content.decode()
2. data = data.replace("'",'"')
3. data = json.loads(data)
这就是前文提到为什么要用json模块的原因了。

三、功能拼装
前文提到,页码一共2页,做一次循环,将list数据拼装到一起,然后生成一张DataFrame表格就完事了。
先图后码:

5d352d5eaa62ea11d20001f4_html_.png

  1. result = []
  2. for i in range(1,3):
  3. postdata = {
  4. 'tablename': 'swzs',
  5. 'key': 'L1',
  6. 'p': '{}'.format(i),

  7. 'where': "L1 in('801010','801020','801030','801040','801050','801080','801110','801120','801130','801140','801150','801160','801170','801180','801200','801210','801230','801710','801720','801730','801740','801750','801760','801770','801780','801790','801880','801890')",

  8. 'orderby': '',

  9. 'fieldlist': 'L1,L2,L3,L4,L5,L6,L7,L8,L11',
  10. 'pagecount': '28',
  11. 'timed': '{}'.format(int(time.time()*1000))
  12. }
    13.
    14.
  13. url = 'http://www.swsindex.com/handler.aspx'
  14. req = requests.post(url, headers=headers, data=postdata)
    17.
    18.
  15. data =req.content.decode()
    20.
  16. data = data.replace("'",'"')
  17. data = json.loads(data)
    23.
  18. result.extend(data['root'])
    25.
  19. result= pd.DataFrame(result)
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin