加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

用Python爬取金融市场数据

发布时间:2019-01-17 23:31:45 所属栏目:教程 来源:隠塵退士
导读:一、写在前面 因为在平常的事变中,必要对某信任网的信任在售和资管在售数据举办统计说明,可是一条一条的输入,显然过分耗时耗力,于是萌生了写个爬虫的设法。 一门计较机说话,可以当做是在仿照人的目标或意图来举办一系列举动或举措,以是在写代码之前

⑥ 生涯数据到当地(以dataframe名目生涯到当地CSV名目)

  1. # 生涯数据为dataframe名目CSV文件 
  2.     df = pd.DataFrame(items) 
  3.     df.to_csv('data.csv',index=False,sep=',',encoding='utf-8-sig') 
  4.  
  5. 好了,此刻就大功告成了,最后不要只让本身爽,也要让对方的处事器别太惆怅,在一些处所休眠几秒,完备代码如下。 
  6.  
  7. import urllib.request 
  8. import urllib.parse 
  9. import re 
  10. import random 
  11. from bs4 import BeautifulSoup 
  12. import pandas as pd 
  13. import time 
  14.  
  15. # 界说第1个分函数joint,用来拼接url 
  16. def joint(url,size=None,page=None,type=None,id=None): 
  17.     if len(url) > 45: 
  18.         condition = 'producttype:' + type + '|status:在售' 
  19.         data = { 
  20.         'mode': 'statistics', 
  21.         'pageSize': size, 
  22.         'pageIndex': str(page), 
  23.         'conditionStr': condition, 
  24.         'start_released': '', 
  25.         'end_released': '', 
  26.         'orderStr': '1', 
  27.         'ascStr': 'ulup' 
  28.         } 
  29.         joint_str = urllib.parse.urlencode(data) 
  30.         url_new = url + joint_str 
  31.     else: 
  32.         data = { 
  33.             'id':id 
  34.             } 
  35.         joint_str = urllib.parse.urlencode(data) 
  36.         url_new = url + joint_str 
  37.     return url_new 
  38.  
  39. # 界说第2个函数que_res,用来构建request发送哀求,并返反相应response 
  40. def que_res(url): 
  41.  
  42.     # 构建request的第一步——构建头部:headers 
  43.     USER_AGENTS = [  
  44.         "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", 
  45.         "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)", 
  46.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", 
  47.         "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)", 
  48.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)", 
  49.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)", 
  50.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)", 
  51.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)", 
  52.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)", 
  53.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)", 
  54.         ] 
  55.     user_agent = random.choice(USER_AGENTS) 
  56.     headers = { 
  57.         'Accept-Language': 'zh-CN,zh;q=0.8', 
  58.         'Connection': 'keep-alive',  
  59.         'Host': 'www.某信任网.com', 
  60.         'Referer': 'http://www.某信任网.com/Product/Index.aspx', 
  61.         'User-Agent': user_agent, 
  62.         'X-Requested-With': 'XMLHttpRequest' 
  63.         } 
  64.  
  65.     # 构建request的第二步——构建request 
  66.     request = urllib.request.Request(url=url, headers=headers) 
  67.  
  68.  
  69.     # 提倡哀求的第一步——构建署理池 
  70.     proxy_list = [       
  71.         {'http':'125.40.29.100:8118'}, 
  72.         {'http':'14.118.135.10:808'} 
  73.         ] 
  74.     proxy = random.choice(proxy_list) 
  75.  
  76.     # 提倡哀求的第二步——建设handler和opener 
  77.     handler = urllib.request.ProxyHandler(proxy) 
  78.     opener = urllib.request.build_opener(handler) 
  79.  
  80.     # 提倡哀求的第三步——提倡哀求,获取相应内容并解码 
  81.     response = opener.open(request).read().decode() 
  82.  
  83.     # 返回值 
  84.     return response 
  85.  
  86. # 界说第3个函数parse_content_1,用来理会并匹配第一层网页内容,此处行使正则表达式要领 
  87. def parse_content_1(response): 
  88.  
  89.     # 写正则举办所需数据的匹配 
  90.     re_1 = re.compile( 
  91.     r'{"ROWID".*?"ID":"(.*?)","Title":"(.*?)","producttype".*?"issuers":"(.*?)","released":"(.*?) 0:00:00","PeriodTo":(.*?),"StartPrice".*?"moneyinto":"(.*?)","EstimatedRatio1":(.*?),"status":.*?"}') 
  92.     contents = re_1.findall(response) 
  93.     return contents 
  94.  
  95. # 界说第4个函数parse_content_2,用来理会并匹配第二层网页内容,并输出数据,此处行使BeautifulSoup要领 
  96. def parse_content_2(response,content): 
  97.  
  98.     # 行使bs4举办爬取第二层信息 
  99.     soup = BeautifulSoup(response) 
  100.  
  101.     # 爬取刊行地和收益分派方法,该信息位于id为procon1下的table下的第4个tr里 
  102.     tr_3 = soup.select('#procon1 > table > tr')[3]         #select到第四个方针tr 
  103.     address = tr_3.select('.pro-textcolor')[0].text        #select到该tr下的class为pro-textcolor的第一个内容(刊行地) 
  104.     r_style = tr_3.select('.pro-textcolor')[1].text        #select到该tr下的class为pro-textcolor的第二个内容(收益分派方法) 
  105.  
  106.     # 爬取刊行局限,该信息位于id为procon1下的table下的第5个tr里 
  107.     tr_4 = soup.select('#procon1 > table > tr')[4]         #select到第五个方针tr     
  108.     guimo = tr_4.select('.pro-textcolor')[1].text          #select到该tr下的class为pro-textcolor的第二个内容(刊行局限:至***万) 
  109.     re_2 = re.compile(r'.*?(d+).*?', re.S)                #设立一个正则表达式,将纯数字提取出来 
  110.     scale = re_2.findall(guimo)[0]                         #提取出纯数字的刊行局限 
  111.  
  112.     # 爬取收益率,该信息位于id为procon1下的table下的第8个tr里 
  113.     tr_7 = soup.select('#procon1 > table > tr')[7]         #select到第八个方针tr 
  114.     rate = tr_7.select('.pro-textcolor')[0].text[:(-1)]    #select到该tr下的class为pro-textcolor的第一个内容(且通过下标[-1]将末端的 % 去除) 
  115.     r = rate.split('至')                                   #此处用来提取最低收益和最高收益 
  116.     r_min = r[0] 
  117.     r_max = r[1] 
  118.  
  119.     # 提取利率品级 
  120.     tr_11 = soup.select('#procon1 > table > tr')[11]       #select到第十二个方针tr 
  121.     r_grade = tr_11.select('p')[0].text                    #select到该tr下的p下的第一个内容(即利率品级) 
  122.  
  123.     # 生涯数据到一个字典中 
  124.     item = { 
  125.     '产物名称':content[1], 
  126.     '刊行机构':content[2], 
  127.     '刊行时刻':content[3], 
  128.     '产物限期':content[4], 
  129.     '投资行业':content[5], 
  130.     '首页收益':content[6], 
  131.     '刊行地': address, 
  132.     '收益分派方法': r_style, 
  133.     '刊行局限': scale, 
  134.     '最低收益': r_min, 
  135.     '最高收益': r_max, 
  136.     '利率品级': r_grade 
  137.     } 
  138.  
  139.     # 返回数据 
  140.     return item 
  141.  
  142. # 界说一个主函数 
  143. def main(): 
  144.  
  145.     # 写入相干数据 
  146.     url_1 = 'http://www.某信任网.com/Action/ProductAJAX.ashx?' 
  147.     url_2 = 'http://www.某信任网.com/Product/Detail.aspx?' 
  148.     size = input('请输入每页表现数目:') 
  149.     start_page = int(input('请输入起始页码:')) 
  150.     end_page = int(input('请输入竣事页码')) 
  151.     type = input('请输入产物范例(1代表信任,2代表资管):')  
  152.     items = []                       # 界说一个空列表用来存储数据 
  153.  
  154.     # 写轮回爬取每一页 
  155.     for page in range(start_page, end_page + 1): 
  156.  
  157.         # 第一层网页的爬取流程 
  158.         print('第{}页开始爬取'.format(page)) 
  159.         # 1、拼接url——可界说一个分函数1:joint 
  160.         url_new = joint(url_1,size=size,page=page,type=type) 
  161.  
  162.         # 2、提倡哀求,获取相应——可界说一个分函数2:que_res 
  163.         response = que_res(url_new) 
  164.  
  165.         # 3、理会内容,获取所需数据——可界说一个分函数3:parse_content_1 
  166.         contents = parse_content_1(response) 
  167.  
  168.         # 4、休眠2秒 
  169.         time.sleep(2) 
  170.  
  171.         # 第二层网页的爬取流程 
  172.  
  173.         for content in contents: 
  174.             print('    第{}页{}开始下载'.format(page,content[0])) 
  175.             # 1、拼接url 
  176.             id = content[0] 
  177.             url_2_new = joint(url_2,id=id)      # joint为前面界说的第1个函数 
  178.  
  179.             # 2、提倡哀求,获取相应 
  180.             response_2 = que_res(url_2_new)     # que_res为前面界说的第2个函数 
  181.  
  182.             # 3、理会内容,获取所需数据——可界说一个分函数4:parse_content_2,直接返回字典名目标数据 
  183.             item = parse_content_2(response_2,content) 
  184.  
  185.             # 存储数据 
  186.             items.append(item) 
  187.             print('    第{}页{}竣事下载'.format(page,content[0])) 
  188.             # 休眠5秒 
  189.             time.sleep(5) 
  190.  
  191.         print('第{}页竣事爬取'.format(page)) 
  192.  
  193.  
  194.     # 生涯数据为dataframe名目CSV文件 
  195.     df = pd.DataFrame(items) 
  196.     df.to_csv('data.csv',index=False,sep=',',encoding='utf-8-sig') 
  197.  
  198.     print('*'*30) 
  199.     print('所有爬取竣事') 
  200.  
  201. if __name__ == '__main__': 
  202.     main() 

3、爬取功效

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读