目标:获取所有公募基金季报中,公募基金经理兼任专户的说明

整体思路

  • 1.分析网站
    • 1.1 动态网站判断
    • 1.2 动态网址查找
    • 1.3 链接后网址正文
  • 2.数据预处理
  • 3.解析正文
  • 4.总结

1.分析网站

分析网站目标:找到季度报告正文的网址

1.1 动态网站判断

方法1:F12 – 刷新 – network – response(这个就是爬虫下来html的内容)

方法2:选择不同页码,对应的网址却没有变

无法在html中找到对应公告信息,判断为动态网站,数据并不是写死在html中,而是通过js动态载入。
动态网站参考网页链接

1.2 动态网址查找

需要找到每个链接对应网址,再解析链接后的网址正文。
观察html为 jjgg 式样,需要在js中找到 jjgg_callback 字样


这里可以发现网站js的传输是通过api方式
在这里需要用到 jjgg_callback 的信息:Request URL;Cookie;Referer;User-Agent
尝试获取 jjgg_callback api的信息,获取如下:

import requestsheaders = {'Cookie': 'st_si=99027663711701; st_asi=delete; waptgshowtime=2020828; st_pvi=70538069672572;  st_sp=2020-06-24%2015%3A19%3A49; st_inirUrl=http%3A%2F%2Ffund.eastmoney.com%2F; st_sn=25; st_psi=20200828094817672-0-9387674093','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)   Chrome/83.0.4103.97 Safari/537.36 Edg/83.0.478.45','Referer': 'http://fund.eastmoney.com/fund_favor_quote2_beta.html'}
url = """http://api.fund.eastmoney.com/f10/JJGG?callback=jQuery18302595673019850113_1598576452497&fundcode={}&pageIndex=1&pageSize=5&type=3&_=1598576452513""".format(fundcode)
get_result = requests.get(url, headers=headers).text
print(get_result)


可以发现api中记录了【fundcode,title,ID等信息】。即一个基金代码,通过API获取了一系列【fundcode,title,ID等信息】,将其封装成函数,如下:

import requests
import re
import json
import pandas as pddef draw_api_info(fundcode):headers = {'Cookie': 'st_si=99027663711701; st_asi=delete; waptgshowtime=2020828; st_pvi=70538069672572; st_sp=2020-06-24%2015%3A19%3A49; st_inirUrl=http%3A%2F%2Ffund.eastmoney.com%2F; st_sn=25; st_psi=20200828094817672-0-9387674093','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36 Edg/83.0.478.45','Referer': 'http://fund.eastmoney.com/fund_favor_quote2_beta.html'}url = """http://api.fund.eastmoney.com/f10/JJGG?callback=jQuery18302595673019850113_1598576452497&fundcode={}&pageIndex=1&pageSize=5&type=3&_=1598576452513""".format(fundcode)text_api_info = requests.get(url, headers=headers).texttext_api_info = re.sub(r'(jQuery\d+_\d+[\(])|([\)]$)','',text_api_info)dic_draw_api = json.loads(text_api_info)df_api_info = pd.DataFrame(dic_draw_api['Data'])return df_api_info

1.3 链接后网址正文

点开链接的季报后,审查元素发现response中仍然没有对应元素

在network – XHR中可以找到正文的相关内容

通过观察XHR中的RequestURL:https://np-cnotice-fund.eastmoney.com/api/content/ann?client_source=web_fund&show_all=1&art_code=AN202101211452777179可以看出art_code即为api获取对应的id

1.通过【定期报告页面】找到api中传输的id
2.通过api中的id定位,找到【报告正文页面】

2.数据预处理

目标:找到需要提取报告的最小基金代码组合

  • 1 可以兼任相关法规在5月1日实施,有相关内容的披露只能是2020年2季报,2020年3季报,2020年4季报。因此目标基金的到期日应该大于20200630
  • 2.目前只披露到4季报,成立小于2个月的基金不需要披露季报。因此筛选成立日小于20201031
  • 3.同一基金经理会管理多个基金,如果该基金经理兼任了专户,会在他管理的所有基金都进行披露,因此只取一个基金即可。

将获取的基金列表存在本地文件【公募基金v3.xlsx】,加工文件得到每个基金对应的报告正文链接,存在本地【html筛选v4.xlsx】


def get_href( shred_date=20200630):df_fund_code = pd.read_excel('公募基金v3.xlsx')df_fund_code['code'] = df_fund_code['S_INFO_WINDCODE'].str.replace('.OF','')df_target = pd.DataFrame()for code in df_fund_code['code']:df_id_trans = draw_api_info(code)if df_id_trans.empty:passelse:df_id_trans['PUBLISHDATEDesc'] = df_id_trans['PUBLISHDATEDesc'].apply(lambda x:int(x.replace('-','')))df_id_trans = df_id_trans[df_id_trans['PUBLISHDATEDesc']>shred_date]df_id_trans = df_id_trans[df_id_trans['TITLE'].str.contains('季度报告')]if df_id_trans.empty:passelse:df_target = df_target.append(df_id_trans)print(code)df_target['href'] = 'http://fund.eastmoney.com/gonggao/' + df_target['FUNDCODE'] + ','+ df_target['ID']+'.html'df_target['pdf_href'] = 'https://pdf.dfcfw.com/pdf/H2_' + df_target['ID'] + '_1.pdf'df_target['web_href'] = 'https://np-cnotice-fund.eastmoney.com/api/content/ann?client_source=web_fund&show_all=1&art_code='+df_target['ID']df_target.to_excel('html筛选v4.xlsx')return df_target

3.解析正文

由于季度报告比较固定,就没用BeautifulSoup,直接正则匹配就可以得到结果。

小tips:

  • 1.编号不一定唯一,如搜索【4.1】,可能出现盈利…1234.1元之类
  • 2.有些不规范的季报可能编号缺失,标题内容保持一致
  • 3.有些编号与标题之间有空格,有些没有
  • 4.QD的季报结构与非QD的季报结构,货币与非货币的季报结构不一致
  • 5.需要循环多,期初可能考虑情况不足,用try,except 记录没考虑到情况的数据,避免每次从头循环

def handle():headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36','Referer': 'http://fund.eastmoney.com/gonggao/040001,AN202010271423925016.html'}df_target = pd.read_excel('D:\\领导报告\\兼任专户披露\\html筛选v4.xlsx')df_target['S_INFO_WINDCODE'] =df_target['FUNDCODE'].astype(int).astype(str).str.zfill(6)dic = {}except_ = [] # 记录异常值for i in df_target.index:url = df_target.loc[i,'web_href']title = df_target.loc[i,'TITLE']code = df_target.loc[i,'S_INFO_WINDCODE']name = df_target.loc[i,'ShortTitle']html = requests.get(url, headers=headers).texttry:pattern = re.compile(r'\s*管理人报告(.*?)\s*投资组合报告', re.DOTALL)res_string = pattern.findall(html)[0]target = ''if '期末兼任私募资产管理计划投资经理' in res_string:if '管理人对报告期内本基金运作遵规守信情况的说明' in res_string:pattern2 = re.compile(r'(期末兼任私募资产管理计划投资经理.*?)管理人对报告期内本基金运作遵规守信情况的说明', re.DOTALL | re.S)elif '境外投资顾问为本基金提供投资建议的主要成员' in res_string:pattern2 = re.compile(r'(期末兼任私募资产管理计划投资经理.*?)境外投资顾问为本基金提供投资建议的主要成员', re.DOTALL|re.S)target = pattern2.findall(res_string)[0].replace('\\r','').replace('\\n','').replace('4.2','')dic[i] = [code, name, title, url, target]except:except_.append(i)print(code)df_f = pd.DataFrame.from_dict(dic).Tdf_f.columns = ['基金代码', '基金简称', '报告简称', '报告链接', '提取文本']df_f['基金代码'] = df_f['基金代码'].astype(int).astype(str).str.zfill(6) + '.OF'return df_f

4.总结

1.动态的数据传输,找js中的api,链接后的正文在XPH中找对应元素
2.对数据预处理不仅仅包括输出清洗,对场景的分析,也可以减小任务量
3.解析正文中,要先了解大致分类,从粗略检索再到精致检索,为保证效率,把没考虑到的异常值在except中保留下来,确保程序的正常运行。

爬虫_获取天天基金网基金季报对应信息相关推荐

  1. python爬虫公众号_python爬虫_微信公众号推送信息爬取的实例

    问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...

  2. python微信爬取教程_python爬虫_微信公众号推送信息爬取的实例

    问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...

  3. python微信公众号推送_python爬虫_微信公众号推送信息爬取的实例

    问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...

  4. linux uname内核,Linux下confstr与uname函数_获取C库与内核信息

    Linux下confstr与uname函数_获取C库与内核信息 #include #include  //uname int main(int argc, char **argv[]) { struc ...

  5. python爬虫(14)获取淘宝MM个人信息及照片(中)

    python爬虫(14)获取淘宝MM个人信息及照片(中) python爬虫(14)获取淘宝MM个人信息及照片(上) python爬虫(14)获取淘宝MM个人信息及照片(下)(windows版本) 在上 ...

  6. python爬虫(14)获取淘宝MM个人信息及照片(上)

    python爬虫(14)获取淘宝MM个人信息及照片(上) python爬虫(14)获取淘宝MM个人信息及照片(中) python爬虫(14)获取淘宝MM个人信息及照片(下)(windows版本) 网上 ...

  7. Python学习之爬虫(一)--获取论坛中学生获得offer信息

    Python学习之爬虫(一)–获取论坛中学生获得offer信息 目的:爬取帖子中每个学生的offer信息,并保存在Excel文档中. 爬取结果 过程 1. 爬取每个帖子中学生offer信息 1.1 查 ...

  8. python爬虫爬取雪球网_Python爬虫爬取天天基金网基金排行

    本文以天天基金网为例,爬取网站上的基金排行并存储在本地记事本中和MongoDB数据库中. 打开网页我们看到每页最多显示50个基金信息,在源代码中,我们发现其他页码没有跳转链接.但是我们选择右下角不分页 ...

  9. 爬虫(11)-爬虫爬取天天基金网基金排行

    文章目录 1.网址分析 2.网页信息分析 3.代码 4.结果展示 CSDN上大部分爬取天天基金的博客都失效或者无法有效爬取信息,本文可以有效抓取网页上的信息. 认为有用的话请点赞,码字不易,谢谢. 其 ...

最新文章

  1. Linux批量文件名大小写转换,Linux中批量把目录内文件名转换大小写用tr
  2. java Math类中的pow方法的问题Math.pow(64,1/3)是1而不是4
  3. 数据中台应用实战50篇(一)-带你概览BI、数据仓库、数据湖与数据中台之间有什么关联关系?(建议收藏)
  4. java window linux_java环境变量配置(Windows Linux)
  5. gVIM+ctags+Taglist+winmanager搭建IDE
  6. linux查用户的家目录,详解Linux误删用户家目录的恢复方法
  7. STM32中GPIO_Mode--GPIO配置
  8. php jq表格,如何用jQuery操作表单和表格
  9. 【C语言】矩阵的最大值(指针专题)
  10. Python Tricks(二十)—— 阶乘的极简实现
  11. linux 下查看文件修改时间
  12. 读书笔记:《把时间当作朋友》
  13. 在线卡密销售系统之JAVA WEB学习之路
  14. mac PowerPoint 导出高分辨率图片
  15. ffmpeg把yuv数据转换成jpeg图片
  16. 互联网日报 | 7月14日 星期三 | 京东宣布涨薪两个月;腾讯收购搜狗股权获无条件批准;教育部辟谣取消教师寒暑假...
  17. 微商加粉方法,微商加粉,究竟难在哪?
  18. JAVA计算机毕业设计SEOUL设计师品牌代购商城Mybatis+系统+数据库+调试部署
  19. oracle系统漏洞绿盟,【处置建议】Oracle WebLogic反序列化漏洞(CVE-2018-2628)安全处置建议...
  20. 云宏广东省中医院虚拟化管理平台

热门文章

  1. 博弈论知识汇总(算法)
  2. python测试题:请设计一个图书类Book,包括书号(num),书名(name),出版日期(Date) 从键盘输入图书册数n,接着输入n个图书信息,按书名排序输出所有图书信息
  3. 一加OnePlus Nord预告图和相机结构图曝光
  4. 差点错过、从未错过的米歇尔·劳德鲁普
  5. 游戏UI设计的一些原则与思考
  6. 地线与接地螺丝_接地线使用方法和注意事项
  7. 计算机技术流浪地球,玩商时代观察:《流浪地球》原著作者刘慈欣:计算机技术是个坑!...
  8. 密码学【java】初探究之springboo集成mybatis,swagger,数字签名
  9. 这种公司就应该和他硬刚!!!
  10. 第一章 略说中医的学习与研究(5)