楼主: wl142857
20549 4

[讨论交流] 【量化杂谈之基础篇1】获取所有股票的代码和名字——一个爬虫的简单例子 [推广有奖]

  • 0关注
  • 34粉丝

硕士生

70%

还不是VIP/贵宾

-

威望
0
论坛币
201 个
通用积分
0
学术水平
11 点
热心指数
12 点
信用等级
8 点
经验
7091 点
帖子
86
精华
0
在线时间
281 小时
注册时间
2009-2-22
最后登录
2020-6-24

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
对量化投资策略进行研究,第一步就是获取我们需要的数据。使用历史数据能够对策略进行回测,以验证策略的有效性和可信性。另一方面,量化投资本身也是一种对数据的研究,因此它也必须遵循数据分析的相关步骤。作为一个业余的量化投资爱好者,免费的数据来源主要有以下几种途径:

  • Yahoo、Sina 财经的API
  • Python的Tushare包
  • 自己手工爬取

      Tushare是一个免费、开源的Python财经数据接口包,它对数据进行了规整因此使用起来非常方便。尽管有如此优秀的数据包简化了数据的采集工作,我们依然需要掌握从网站上爬取数据的技能,以获取接口没有提供的数据。本篇文章将会介绍一个小爬虫,告诉大家如何从网站上获取所有股票的代码和名称。
      Python的urllib2库是爬虫的基础,使用urllib2库可以获取网页的内容,再使用正则表达式对所需的内容进行提取。我们在东方财富网的stocklist页面下对股票的代码和名字进行爬取,若要获取该网页下的全部内容,则需要以下几步:

  • 对服务器发送一个请求,使用urllib2的Request方法返回reguest对象
  • 采用urlopen方法处理构建的request对象,返回服务器的应答(response对象)
  • 对response对象使用read方法,返回网页的内容

  1. request = urllib2.Request('http://quote.eastmoney.com/stocklist.html')
  2. response = urllib2.urlopen(request)
  3. content = response.read().decode("gbk")
复制代码

       一些网站不允许程序直接采用上面的方式进行访问,因此需要通过程序模拟浏览器的行为。通常采用的技术是在Requset方法的headers参数中设置agent,这样服务器认为是浏览器发出的请求就可以正常respose。
  1. url ='http://quote.eastmoney.com/stocklist.html'
  2. headers = { 'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' }
  3. request = urllib2.Request(url,headers)
复制代码
在进行网页内容的读取过程中,会遇到这样或那样的原因导致异常使得读取不成功,可以使用try-except捕获相应的异常。
  1. try:    urllib2.urlopen(request)except urllib2.URLError, e:    if hasattr(e,"code"):        print u"爬取股票列表失败,错误原因",e.reason
复制代码
      以上就是获取网页Html的过程,下面就需要在这茫茫Html中获取我们需要的东西。这个时候需要用到正则表达式对需要的内容进行匹配。
view-source_quote_eastmoney_com_stocklist_html.jpg
      上图中蓝色标出的部分是我们需要的股票名称和代码,采取以下正则表达式可以获取需要的内容。正则表达式的写法不是唯一的,但需要保证使用该正则不会出现遗漏或多匹配出不需要的其他信息的情况。如果你对正则表达式不太熟悉也没有关系,Python提供了Beautiful Soup工具能够更为简单地提起Html或者Xml中的内容。
  1. pattern = re.compile('<li><a.*?href=.*?html">(.*?)\((.*?)\).*?</li>',re.S)
  2. items = re.findall(pattern,content)
复制代码
      采用findall方法返回的是一个List,我们可以将爬取的结果放在一个名为stocklist的txt文件中。
  1. reload(sys)
  2. sys.setdefaultencoding('utf-8')
  3. f = open('stocklist.txt','w')
  4. for item in items:
  5.      f.write(item[1]+','+item[0]+'\n')
  6. f.close()
复制代码
      当然,更好的结果储存方式是将结果放在数据库中,下面就是以sqllite数据库为例进行了一个爬取结果的储存。将爬取结果放在数据库中能够方便调用,并且可以设置shell任务做定时的爬取和更新。

  1. conn = sqlite3.connect("stock.db")
  2. cursor = conn.cursor()
  3. cursor.execute('''drop table if exists stock_index''')
  4. cursor.execute('''create table if not exists stock_index (stock_name varchar(60), id varchar(20))''')
  5. cursor.executemany("insert into stock_index(stock_name,id) values(?, ?)", stockList)
  6. conn.commit()
  7. cursor.close()
  8. conn.close()
复制代码
      好了,如何从网站上爬取我们需要的数据就介绍到这里。Python有着更为强大的爬虫框架Scrapy,有兴趣的同学可以学习一下。关于本次小爬虫的全部代码,可以关注我的微信公众号,以后会有更多关于量化的原创文章哦!。

我的微信公众号:会掘金的小鹿(NuggetsRoad)
是时候关注一波了!!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:基础篇 compatible eastmoney beautiful response 量化投资 爬虫 python爬虫

已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
jiuhtsair + 5 + 3 + 4 + 4 精彩帖子
accumulation + 100 + 1 + 1 + 1 精彩帖子
残阳_等待 + 100 精彩帖子

总评分: 经验 + 200  论坛币 + 5  学术水平 + 4  热心指数 + 5  信用等级 + 5   查看全部评分

本帖被以下文库推荐

沙发
残阳_等待 发表于 2015-12-20 16:47:19 |只看作者 |坛友微信交流群
学习

使用道具

藤椅
littlemay723 学生认证  发表于 2016-1-23 18:04:58 |只看作者 |坛友微信交流群
好高端,我只懂英文,但字符窜看不懂

使用道具

板凳
xzd3323210 发表于 2016-4-17 12:35:33 |只看作者 |坛友微信交流群
items = re.findall(pattern,content)这句里的content是什么?

使用道具

报纸
wl142857 发表于 2016-4-23 19:15:25 |只看作者 |坛友微信交流群
xzd3323210 发表于 2016-4-17 12:35
items = re.findall(pattern,content)这句里的content是什么?
content = response.read().decode("gbk")  网站的html

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-6-16 23:06