request 爬虫,python爬虫爬取基金

  request 爬虫,python爬虫爬取基金

  一、请求探索网页分析:

  页码分析:

  1.第一页:https://gs.amac.org.cn/amac-infodisc/api/pof/fund?rand=0.652806594661254 page=0 size=20

  2.第二页:https://gs.amac.org.cn/amac-infodisc/api/pof/fund?rand=0.652806594661254 page=1 size=20

  3.https://gs.amac.org.cn/amac-infodisc/api/pof/fund?rand=0.652806594661254 page=2 size=20

  单数刷新一下边缘发生变化:似乎就是是一个随机数

  https://gs.amac.org.cn/amac-infodisc/api/pof/fund?rand=0.16767992415199218 page=0 size=20

  规律变化:页码部分需要调整,兰特部分随机的。

  https://gs.amac.org.cn/amac-infodisc/api/pof/fund?rand={} page={} size=20

  也可以通过射流研究…查看确定一下就是用的一个随机函数:

  写段代码产生随机数:

  随机导入

  r=random.random()

  打印(字符串)完整请求一个页面如下所示:

  导入请求

  随机导入

  导入数据

  导入时间

  标题={

  接受-语言: zh-CN,zh;q=0.9 ,

  "内容类型":"应用程序/json”,

  Origin: http://gs.amac.org.cn ,

  referer : https://GS。amac。org。cn/amac-info disc/RES/POF/fund/index。 html ,

  用户代理: Mozilla/5.0(Linux;安卓6.0;nexus 5 Build/MRA 58n)苹果WebKit/537.36(KHTML,像壁虎)铬/101。0 .4951 .54移动Safari/537.36英寸

  }

  r=random.random()

  数量=1

  网址=https://gs.amac.org.cn/amac-infodisc/api/pof/fund?rand= str(r) page= str(num) size=20

  数据={}

  data=json.dumps(data)

  response=requests.post(url=url,data=data,headers=headers)

  打印(响应)

  二、分析详情页面

  2.1 基本解析例如分析这一个详情页面:https://GS。amac。org。cn/amac-info disc/RES/POF/fund/351000128956。超文本标记语言

  我们使用美味的汤来解析它。

  response=requests.get(url2,headers=headers) #请求详情页面

  html=requests.get(url=url,headers=headers)。内容。解码( utf-8 )#获取详情页面的全球资源定位器(统一资源定位器)

  #打印(html)

  soup=BeautifulSoup(html, lxml) #接卸分析具体内容:上面一个表内容都在一个桌子里面

  下面一个表信息透露情况:单独又在另外一个桌子里面

  2.2 内容定位获取

  比如定位基金名称,最简单的做法就是直接复制xpath:

  num 1=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[1]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #基金名称

  三、完整源码#编码:utf-8

  导入请求

  随机导入

  导入数据

  从什么是导入诡异又阴森的树形灯

  导入编解码器

  导入战斗支援车

  计数=0

  行数=[]

  对于范围(1,15)内的我:

  标题={

  接受-语言: zh-CN,zh;q=0.9 ,

  "内容类型":"应用程序/json”,

  Origin: http://gs.amac.org.cn ,

  referer : https://GS。amac。org。cn/amac-info disc/RES/POF/fund/index。 html ,

  用户代理: Mozilla/5.0(Linux;安卓6.0;nexus 5 Build/MRA 58n)苹果WebKit/537.36(KHTML,像壁虎)铬/101。0 .4951 .54移动Safari/537.36英寸

  }

  r=random.random()

  数量=1

  网址=https://gs.amac.org.cn/amac-infodisc/api/pof/fund?rand= str(r) page= str(I) size=20

  数据={}

  data=json.dumps(data)

  response=requests.post(url=url,data=data,headers=headers)

  #打印(响应)

  datas=JSON。负载(响应。文本)[内容]

  :cvar

  获取每一个页面的链接

  对于数据中的数据1:

  jjid=data1[id] #基金身份

  管理器URL=data1[管理器URL ]#经理页全球资源定位器(统一资源定位器)

  #打印(管理)

  fundName=data1[fundName] #基金名称

  #打印(基金名称)

  经理姓名=数据1[经理姓名]#基金管理人名称

  #打印(管理名)

  url=data1[url] #获取分支全球资源定位器(统一资源定位器)

  #打印(网址)

  URL 2= https://GS。amac。org。cn/amac-info disc/RES/POF/fund/ URL #构造完整url,根据每一个链接获取详情页面

  #打印(网址2)

  计数=1

  打印(正在爬取第str(计数) 条数据)

  :cvar

  开始解析详情页面

  html=requests.get(url=url2,headers=headers)。文字。编码( utf-8 )#请求详情页面的全球资源定位器(统一资源定位器)

  #打印(html)

  tree=etree .HTML(html) #标准化

  #编码( ISO-8859-1 ).解码(“utf-8”)解决乱码问题: 转换为正常的中文:

  num 1 _ 0=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[1]/TD[2]/text(),

  编码=utf-8 )

  如果len(num1_0)==0:

  num1=num1_0

  否则:

  num 1=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[1]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #基金名称

  num 2=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[2]/TD[2]/text(),

  encoding=utf-8) #基金编号

  #打印(数字2)

  num 3 _ 0=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[3]/TD[2]/text(),

  编码=utf-8 )

  如果len(num3_0)==0:

  num3=num3_0

  否则:

  数字3=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[3]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , )#成立时间

  num 4 _ 0=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[4]/TD[2]/text(),

  编码=utf-8 )

  如果len(num4_0)==0:

  num4=num4_0

  否则:

  数字4=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[4]/TD[2]/text(),

  encoding=utf-8)[0].替换( , )。替换( \t , )#备案时间

  num 5 _ 0=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[5]/TD[2]/text(),

  编码=utf-8 )

  如果len(num5_0)==0:

  num5=num5_0

  否则:

  数字5=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[5]/TD[2]/text(),

  encoding=utf-8)[0].编码(

  ISO-8859-1’).解码( utf-8) #基金类型

  num 6 _ 0=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[6]/TD[2]/text(),

  编码=utf-8 )

  如果len(num6_0)==0:

  num6=num6_0

  否则:

  num 6=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[6]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #基金类型

  num 7 _ 0=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[7]/TD[2]/a ,

  编码=utf-8 )

  # print(num7_0)

  # print(len(num7_0))

  如果len(num7_0)==0:

  num7=num7_0

  否则:

  num 7=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[7]/TD[2]/a/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #币种

  #/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[7]/TD[2]/a

  num 8 _ 0=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[7]/TD[2]/a/text(),

  编码=utf-8 )

  如果len(num8_0)==0:

  num8=num8_0

  否则:

  数字8=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[8]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #基金管理人名称

  num 9 _ 0=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[9]/TD[2]/text(),

  编码=utf-8 )

  如果len(num9_0)==0:

  num9=num9_0

  否则:

  num 9=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[9]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #管理类型

  num 10 _ 0=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[10]/TD[2]/text(),

  encoding=utf-8) #托管人名称

  如果len(num10_0)==0:

  数字10=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[10]/TD[2]/text(),

  encoding=utf-8) #托管人名称

  否则:

  数字10=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[10]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #托管人名称

  num 11 _ 0=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[11]/TD[2]/text(),

  编码=utf-8 )

  如果len(num11_0)==0:

  num11=num11_0

  否则:

  编号11=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[11]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #运作状态

  num 12=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[12]/TD[2]/text(),

  encoding=utf-8) #基金信息最后更新时间

  num 13 _ 0=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[13]/TD[2]/text(),

  encoding=utf-8) #基金业协会特别提示

  如果len(num13_0)==0:

  num13=num13_0

  否则:

  编号13=树。XPath(/html/body/div[3]/div/div[2]/div[1]/div[2]/table/tbody/tr[13]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码(“utf-8”)

  仙=树。XPath(/html/body/div[3]/div/div[2]/div[2]/table/tbody/tr[1]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #当月月报

  #打印(西安)

  仙2=树。XPath(/html/body/div[3]/div/div[2]/div[2]/table/tbody/tr[2]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #季报

  仙3=树。XPath(/html/body/div[3]/div/div[2]/div[2]/table/tbody/tr[3]/TD[3]/text(),

  encoding=utf-8) #半年报

  仙4=树。XPath(/html/body/div[3]/div/div[2]/div[2]/table/tbody/tr[4]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #年报

  仙5=树。XPath(/html/body/div[3]/div/div[2]/div[2]/table/tbody/tr[5]/TD[2]/text(),

  encoding=utf-8)[0].替换( \r\n , ).替换( , )。替换( \t , ).编码(

  ISO-8859-1’).解码( utf-8) #账号开立率

  #打印(先5)

  row=(

  num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,num11,num12,num13,先,先2,先3,先4,

  先5)

  rows.append(row)

  #时间。睡眠(1) #设置休眠

  使用编解码器。打开(基金. csv , wb ,编码=gbk ,错误=ignore )作为女:

  writer=csv.writer(f)

  writer.writerow(

  [基金名称, 基金编号, 成立时间, 备案时间, X1 , X2 , X3 , X4 , X5 , x6 , X7 , X8 , X9

  , 当月月报, 季报, 半年报, 年报, 账号开立率])

  writer.writerows(行)效果如下:

  四、总结设计有些欠妥,代码也有些冗余,但是已经写了一下午了,感兴趣的自行优化。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: