前段时间可转债市场很火,近期由于信用债暴雷,可转债市场一下就哑火了。想想就可笑,但可转债市场毕竟有300只左右的规模,未来势必会更大,考虑到tushare没有可转债的实时行情,我就在csdn上找了一个爬虫程序,改了一下。
import jsonimport requestsimport csvimport refrom lxml import etreedef get_dat(): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36", } newUrl ="https://www.jisilu.cn/data/cbnew/cb_list/?___jsl=LST___t=1584777951900" #最简单的爬虫请求.也可以加上headers字段,防止部分网址的反爬虫机制 response = requests.get(newUrl) #当爬取的界面需要用户名密码登录时候,构建的请求需要包含auth字段 data = response.content.decode("utf-8") dat = json.loads(data) # 所有数据 lst_data = [] for one in dat['rows']: # 每一条数据 lst_dat = [] # 转债id id = one["id"] dat_cell = one["cell"] # 是否赎回 is_shui = dat_cell['force_redeem'] if is_shui == None: # 转债名称 name = dat_cell['bond_nm'] # 现价 price = dat_cell['price'] # 溢价率 premium_rt = dat_cell['premium_rt'] # 评级 rating_cd = dat_cell['rating_cd'] # 回售触发价 put_convert_price = dat_cell['put_convert_price'] # 强赎触发价 force_redeem_price = dat_cell['force_redeem_price'] # 剩余时间 last_time = dat_cell['year_left'] # 双低 dblow = dat_cell['dblow'] # 获取赎回价 xiangqing_url = 'https://www.jisilu.cn/data/convert_bond_detail/' + id xiangqing_response = requests.get(xiangqing_url) html = xiangqing_response.content.decode("utf-8") html = etree.HTML(html) lixi = html.xpath('.//td[@id="cpn_desc"]/text()') pattern = re.compile(r'\d+\.\d+?') # 查找数字 lixi = pattern.findall(lixi[0]) shuhuijia = html.xpath('.//td[@id="redeem_price"]/text()') li_price = 0 for li in lixi: li_price = li_price + float(li) try: jiancang = float(shuhuijia[0]) + (li_price - float(lixi[-1])) * 0.8 except: jiancang = 0 # 是否可操作 if jiancang != 0 and float(price) - jiancang < 3: is_oper = '建仓' if jiancang != 0 and float(price) - float(shuhuijia[0]) < 3: is_oper = '加仓' else: is_oper = '' lst_dat.append(id) lst_dat.append(name) lst_dat.append(price) lst_dat.append(jiancang) lst_dat.append(shuhuijia[0]) lst_dat.append('') lst_dat.append(premium_rt) lst_dat.append(rating_cd) lst_dat.append(put_convert_price) lst_dat.append(force_redeem_price) lst_dat.append(last_time) lst_dat.append(dblow) lst_dat.append(is_oper) lst_data.append(lst_dat) else: continue return lst_datadef wirte_csv(data): # 1. 创建文件对象 f = open('可转债.csv', 'w', encoding='gbk', newline='') # 2. 基于文件对象构建 csv写入对象 csv_writer = csv.writer(f) # 3. 构建列表头 csv_writer.writerow(["代 码", "转债名称", "现 价", "建仓线", "加仓线", "重仓线", "溢价率", "评级", "回售触发价", "强赎触发价", "剩余年限", "双低", "操作"]) # 4. 写入csv文件内容 for dat in data: csv_writer.writerow(dat) # 5. 关闭文件 f.close()if __name__ == '__main__': data = get_dat() wirte_csv(data)
结果如下图: