python 获取 中国证券网 的公告

中国证券网: http://ggjd.cnstock.com/
这个网站的公告会比同花顺东方财富的早一点,而且还出现过早上中国证券网已经发了公告,而东财却拿去做午间公告,以至于可以提前获取公告提前埋伏。
 
现在程序自动把抓取的公告存入本网站中:http://30daydo.com/news.php 
每天早上8:30更新一次。
 
生成的公告保存在stock/文件夹下,以日期命名。 下面脚本是循坏检测,如果有新的公告就会继续生成。
 
默认保存前3页的公告。(一次过太多页会被网站暂时屏蔽几分钟)。 代码以及使用了切换header来躲避网站的封杀。
 
修改
getInfo(3) 里面的数字就可以抓取前面某页数据
 
 

公告.PNG
__author__ = 'rocchen'
# working v1.0
from bs4 import BeautifulSoup
import urllib2, datetime, time, codecs, cookielib, random, threading
import os,sys


def getInfo(max_index_user=5):
stock_news_site =
"http://ggjd.cnstock.com/gglist/search/ggkx/"

my_userAgent = [
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',
'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)']
index = 0
max_index = max_index_user
num = 1
temp_time = time.strftime("[%Y-%m-%d]-[%H-%M]", time.localtime())

store_filename = "StockNews-%s.log" % temp_time
fOpen = codecs.open(store_filename, 'w', 'utf-8')

while index < max_index:
user_agent = random.choice(my_userAgent)
# print user_agent
company_news_site = stock_news_site + str(index)
# content = urllib2.urlopen(company_news_site)
headers = {'User-Agent': user_agent, 'Host': "ggjd.cnstock.com", 'DNT': '1',
'Accept': 'text/html, application/xhtml+xml, */*', }
req = urllib2.Request(url=company_news_site, headers=headers)
resp = None
raw_content = ""
try:
resp = urllib2.urlopen(req, timeout=30)

except urllib2.HTTPError as e:
e.fp.read()
except urllib2.URLError as e:
if hasattr(e, 'code'):
print "error code %d" % e.code
elif hasattr(e, 'reason'):
print "error reason %s " % e.reason

finally:
if resp:
raw_content = resp.read()
time.sleep(2)
resp.close()

soup = BeautifulSoup(raw_content, "html.parser")
all_content = soup.find_all("span", "time")

for i in all_content:
news_time = i.string
node = i.next_sibling
str_temp = "No.%s \n%s\t%s\n---> %s \n\n" % (str(num), news_time, node['title'], node['href'])
#print "inside %d" %num
#print str_temp
fOpen.write(str_temp)
num = num + 1

#print "index %d" %index
index = index + 1

fOpen.close()


def execute_task(n=60):
period = int(n)
while True:
print datetime.datetime.now()
getInfo(3)

time.sleep(60 * period)



if __name__ == "__main__":

sub_folder = os.path.join(os.getcwd(), "stock")
if not os.path.exists(sub_folder):
os.mkdir(sub_folder)
os.chdir(sub_folder)
start_time = time.time() # user can change the max index number getInfo(10), by default is getInfo(5)
if len(sys.argv) <2:
n = raw_input("Input Period : ? mins to download every cycle")
else:
n=int(sys.argv[1])
execute_task(n)
end_time = time.time()
print "Total time: %s s." % str(round((end_time - start_time), 4))


 
github:https://github.com/Rockyzsu/cnstock
 

11 个评论

仔细研究了下,写的挺好的,我有两个小建议
1. 有时候访问需要代理,是不是还要考虑代理的情况。
2. node['title']有时候会出现编码问题,可能打印出来的是乱码,是不是也要处理一下。
打印可能会有乱码。 因为你的print函数和系统的编码不一致。 我是写入到文件,所以下面已经用utf编码过,所以显示是正确的。

至于代理,如果你一次不抓取超过30页,应该问题不大。 我最多抓过100页没被封。
在中国证券网里面有个信息预告,可以看到即将分红的股票,今天试了下,可以得到内容,但是不太会拿到里面每个股票的名称,楼主有兴趣一起研究下么?
我现在还没权限去发带外链的。
<table border="0" cellpadding="0" cellspacing="0" class="jytstable" width="100%"><caption> 【分红转增股权登记日】</caption><tr><td><div class="blank10"></div></td></tr><tr><td>
<a href="TD_Transaction_Link.aspx?sc=601998&amp;sn=中信银行&amp;ca=company&amp;se=9900002721" target="_blank">中信银行</a></td><td><a href="TD_Transaction_Link.aspx?sc=000709&amp;sn=河钢股份&amp;ca=company&amp;se=gssz0000709" target="_blank">河钢股份</a></td><td><a href="TD_Transaction_Link.aspx?sc=000858&amp;sn=五 粮 液&amp;ca=company&amp;se=gssz0000858" target="_blank">五 粮 液</a></td><td><a href="TD_Transaction_Link.aspx?sc=600499&amp;sn=科达洁能&amp;ca=company&amp;se=gssh0600499" target="_blank">科达洁能</a></td><td><a href="TD_Transaction_Link.aspx?sc=601333&amp;sn=广深铁路&amp;ca=company&amp;se=9900001741" target="_blank">广深铁路</a></td><td><a href="TD_Transaction_Link.aspx?sc=603828&amp;sn=柯利达&amp;ca=company&amp;se=9900023713" target="_blank">柯利达</a></td><td><a href="TD_Transaction_Link.aspx?sc=000407&amp;sn=胜利股份&amp;ca=company&amp;se=gssz0000407" target="_blank">胜利股份</a></td></tr><tr><td><a href="TD_Transaction_Link.aspx?sc=600651&amp;sn=飞乐音响&amp;ca=company&amp;se=gssh0600651" target="_blank">飞乐音响</a></td><td><a href="TD_Transaction_Link.aspx?sc=002218&amp;sn=拓日新能&amp;ca=company&amp;se=9900004281" target="_blank">拓日新能</a></td></tr></table>
这是今天分红转增股权登记日的股票,但是不太会拿到里面的内容。。。
我抓过,不过很少根据这个去买。 除非是高转送的,低分红都是个坑。。。
里面的我今天看了中信的,还可以。其他的我没买。。就当做个试验。。。

回到那个问题,你是怎么抓的?
<h4><a href="http://xinpi.cnstock.com/Transaction.html" target="_blank">今日交易提示</a></h4>
</div>
<div class="trade-msg">
<p class="hdt"><a href="http://xinpi.cnstock.com/ID_Transaction.aspx?Date=2016-07-22" target="_blank">分红转增股权登记日</a></p>
<ul>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=000407" target="_blank" title="胜利股份">胜利股份</a></li>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=000709" target="_blank" title="河钢股份">河钢股份</a></li>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=000858" target="_blank" title="五 粮 液">五 粮 液</a></li>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=002218" target="_blank" title="拓日新能">拓日新能</a></li>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=600499" target="_blank" title="科达洁能">科达洁能</a></li>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=600651" target="_blank" title="飞乐音响">飞乐音响</a></li>
</ul>
<p class="hdt"><a href="http://xinpi.cnstock.com/ID_Transaction.aspx?Date=2016-07-22" target="_blank">分红转增除权除息日</a></p>
<ul>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=000423" target="_blank" title="东阿阿胶">东阿阿胶</a></li>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=000550" target="_blank" title="江铃汽车">江铃汽车</a></li>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=000715" target="_blank" title="中兴商业">中兴商业</a></li>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=002038" target="_blank" title="双鹭药业">双鹭药业</a></li>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=002319" target="_blank" title="乐通股份">乐通股份</a></li>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=002678" target="_blank" title="珠江钢琴">珠江钢琴</a></li>
</ul>
<p class="hdt"><a href="http://xinpi.cnstock.com/ID_Transaction.aspx?Date=2016-07-22" target="_blank">分红转增股份上市日</a></p>
<ul>
<li><a href="http://bbs.cnstock.com/company/ssgs/?code=002680" target="_blank" title="长生生物">长生生物</a></li>
</ul>
</div>
</div>

找到上面这一段,用beautifulsoup根据 <p class="hdt"> 这个属性就能找到了。
我上面找的是主页的。
恩,多谢提醒思路,我后来采用了lxml去解析,用xpath去找,也很方便:)
能用lxml就用lxml,bs速度慢得多。

要回复文章请先登录注册