精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用Python爬取金融市場數據

開發 后端 大數據
本文結合正則表達式和比較流行的beautifulsoup(bs4),對網頁進行解析并提取數據,因此在正式進行之前,有必要簡單介紹下正則表達式和bs4.

一、寫在前面

由于在平時的工作中,需要對某信托網的信托在售和資管在售數據進行統計分析,但是一條一條的輸入,顯然太過耗時耗力,于是萌生了寫個爬蟲的想法。

一門計算機語言,可以當做是在模仿人的目的或意圖來進行一系列行為或動作,所以在寫代碼之前,首先要弄清楚你要干什么,如果是你,你每一步的動作是什么,然后將這一步步的動作通過代碼傳遞給計算機,讓計算機高效的幫你完成即可。

本文結合正則表達式和比較流行的beautifulsoup(bs4),對網頁進行解析并提取數據,因此在正式進行之前,有必要簡單介紹下正則表達式和bs4.

二、基礎知識

1、正則表達式

具體的詳細介紹可自行去網上補知識,這里只介紹一些規則和常用的用法。

  1. # 正則表達式 
  2. 規則: 
  3.     單字符: 
  4.             .  : 除換行以外所有字符 
  5.             [] : 匹配集合中任意一個字符 
  6.             \d : 數字 
  7.             \D : 非數字 
  8.             \w : 數字、字母、下劃線、中文 
  9.             \W : 非數字、字母、下劃線、中文 
  10.             \s : 空格 
  11.             \S : 非空格 
  12.     數量修飾: 
  13.              * : 任意多次 
  14.              + : 至少1次 
  15.              ?: 非貪婪方式,可有可無 
  16.            {m} : 固定m次 
  17.           {m+} : 至少m次 
  18.          {m,n} : m到n次 
  19.     起始: 
  20.              ^ : 以啥啥開頭 
  21.              $ : 以啥啥結尾 
  22.     常用組合和函數: 
  23.             .* : 貪婪方式任意字符任意次數 
  24.            .*? : 非貪婪方式任意字符任意次數 
  25.            r = re.compile(r'正則表達式',re.S) :  
  26.                               最常用:將規則傳遞給某個參數以便反復使用 
  27.            re.match\re.search\(字符串) 
  28.            re.findall(字符串) 
  29.            re.sub(正則表達式,替換內容,字符串) 

2、bs4

同樣,詳細知識自行補,這里只介紹常用的用法:select結合選擇器的用法。

  1. # bs4用法 
  2. 首先加載里面的BeautifulSoup: 
  3. from bs4 import BeautifulSoup 
  4. soup = BeautifulSoup('網頁響應回來的東西'

主要有以下幾種提取規則:

  1. 1、獲取標簽 
  2.     soup.a   獲取a標簽(***個) 
  3. 2、獲取屬性 
  4.     soup.a.attrs   獲取a標簽下所有的屬性和值,返回的是字典 
  5.     soup.a['name'] 獲取a標簽下的name屬性 
  6. 3、獲取內容 
  7.     soup.a.string() 
  8.     soup.a.text()   建議使用這個 
  9. 4、find用法 
  10.     soup.find('a')  找到***個a 
  11.     soup.find('a',title='')  附加條件的查找 
  12. 5、find_all用法 
  13.     soup.find_all('a')  找到所有a 
  14.     soup.find_all(['a','b']) 找到所有a和b 
  15.     soup.find_all('a',limit=5) 找到前5個a 
  16. 6、select用法——重點 
  17.     結合選擇器使用,常用的選擇器如下: 
  18.     標簽選擇器:如div表示為div 
  19.     類選擇器:.表示,如class = 'you'表示為.you 
  20.     id選擇器:#表示,如id = 'me'表示為#me  
  21.    組合選擇器:如div,.you,#me    
  22.    層級選擇器:如div .you #me表示選取div標簽下的you類下的id為me的內容 
  23.               再如div > .you > #me,> 則表示只能是下面一級 

三、開始實戰——爬取某信托網的信托在售數據

1、爬取前的準備工作——梳理好代碼的邏輯

正如前面所說,寫代碼之前,首先要清楚你想要干什么,如果是你,你是什么樣的動作來達到你的這個目的或意圖。

***,你的目的或意圖是什么,對于本例而言,我需要獲取任意某頁至某頁信托在售產品的下面數據:產品名稱、發行機構、發行時間、***收益、產品期限、投資行業、發行地、收益分配方式、發行規模、***收益、***收益和利率等級劃分情況這12個數據。

第二,如果是人,需要哪些動作來達到這個目的。我們來看下網頁。動作就清晰了:

輸入網址/搜索關鍵字 > 進入網站 > 點擊紅色框框里的信托產品和在售 > 錄入下面綠色框框里的相關信息 > 發現信息不全,再點擊這個產品,在詳情頁(再下一張圖)繼續錄入。

用Python爬取金融市場數據

用Python爬取金融市場數據

2、開始爬取

既然動作清晰了,那就可以讓計算機來模擬人的這個動作進行爬取了。

然后就是寫代碼的邏輯了。我們用做數學題常用的倒推法來梳理這個過程。

要想獲取數據 < 你得解析網頁給你的響應 < 你得有個響應 < 你得發送請求 < 你得有個請求request < 你得有個url。

然后我們再正過來解題:獲取url > 構建request > 發送請求 > 獲取響應 > 解析響應 > 獲取所需數據 > 保存數據。

所以按照這個步驟,我們可以先做出一個大框架,然后在框架的基礎上補充血肉。大框架,就是定義個主函數。

值得注意的是,本例中,每個產品的信息獲取,我們都有二次點擊的動作,即***頁數據不全,我們再點擊進入詳情頁進行剩余數據的獲取,因此,本例是有兩層的數據獲取過程的。***層使用正則表達式,第二層使用bs4。

① 定義主函數

如下是這個主函數,前面的寫入相關數據你可以先不管,這都是在***步的獲取url時,后補過來的。

回到前面的目的:提取任意某頁至任意某頁的數據,所以寫個循環是必須的,然后在循環下方,兩層網頁的數據獲取框架就出來了。(由于第二層網頁的url是根據***層網頁的某個數據拼接出來的,而***層網頁是一下子提取整個頁面所有產品的信息,所以第二層網頁的提取也設置了個循環,對***層網頁的所有產品,一個一個點進去進行提取)

  1. # 定義一個主函數 
  2. def main(): 
  3.  
  4.     # 寫入相關數據 
  5.     url_1 = 'http://www.某信托網.com/Action/ProductAJAX.ashx?' 
  6.     url_2 = 'http://www.某信托網/Product/Detail.aspx?' 
  7.     size = input('請輸入每頁顯示數量:'
  8.     start_page = int(input('請輸入起始頁碼:')) 
  9.     end_page = int(input('請輸入結束頁碼')) 
  10.     type = input('請輸入產品類型(1代表信托,2代表資管):')   
  11.     items = []                # 定義一個空列表用來存儲數據 
  12.  
  13.     # 寫循環爬取每一頁 
  14.     for page in range(start_page, end_page + 1): 
  15.  
  16.     # ***層網頁的爬取流程 
  17.         print('第{}頁開始爬取'.format(page)) 
  18.  
  19.         # 1、拼接url——可定義一個分函數1:joint 
  20.         url_new = joint(url_1 ,size=size ,page=page ,type=type) 
  21.  
  22.         # 2、發起請求,獲取響應——可定義一個分函數2:que_res 
  23.         response = que_res(url_new) 
  24.  
  25.         # 3、解析內容,獲取所需數據——可定義一個分函數3:parse_content_1 
  26.         contents = parse_content_1(response) 
  27.  
  28.         # 4、休眠2秒 
  29.         time.sleep(2) 
  30.  
  31.     # 第二層網頁的爬取流程 
  32.  
  33.         for content in contents: 
  34.             print('    第{}頁{}開始下載'.format(page ,content[0])) 
  35.  
  36.             # 1、拼接url 
  37.             id = content[0] 
  38.             url_2_new = joint(url_2 ,id=id)      # joint為前面定義的第1個函數 
  39.  
  40.             # 2、發起請求,獲取響應 
  41.             response_2 = que_res(url_2_new)     # que_res為前面定義的第2個函數 
  42.  
  43.             # 3、解析內容,獲取所需數據——可定義一個分函數4:parse_content_2,直接返回字典格式的數據 
  44.             item = parse_content_2(response_2 ,content) 
  45.  
  46.             # 存儲數據 
  47.             items.append(item) 
  48.             print('    第{}頁{}結束下載'.format(page ,content[0])) 
  49.  
  50.             # 休眠5秒 
  51.             time.sleep(5) 
  52.  
  53.         print('第{}頁結束爬取'.format(page)) 
  54.  
  55.     # 保存數據為dataframe格式CSV文件 
  56.     df = pd.DataFrame(items) 
  57.     df.to_csv('data.csv' ,index=False ,sep=',' ,encoding='utf-8-sig'
  58.  
  59.    print('*'*30) 
  60.    print('全部爬取結束'
  61.  
  62. if __name__ == '__main__'
  63.     main() 

② 獲取url —— ***層和第二層通用

由于我們需要訪問兩層的數據,所以希望定義一個函數,能對兩層的URL都可以進行拼接。

如下圖為***層頁面的內容和源碼,由第二個紅框中的內容(X-Requested-With:XMLHttpRequest),可知這是一個AJAX get請求,且攜帶者第三個紅框中的數據,而第三個紅框中的數據,又恰好是***個紅框中的url的一部分,即為:

http://www.某信托網.com/Action/ProductAJAX.ashx?加上第三個紅框中的數據。

第三個框框中包括幾個可變的數據:pageSize(表示一頁顯示多少產品);pageIndex(表示第幾頁);conditionStr(定義產品類型,1表示信托,2表示資管),其余的數據都是固定的(這其中有個_:1544925791285這種下劃線帶一串數字的東西,像是個隨機數,去掉也沒影響,我就給去掉了)。

用Python爬取金融市場數據

下圖為第二層頁面的內容和源碼,可見只是一個簡單的get請求,且網址很簡單,就是一個http://www.某信托網.com/Product/Detail.aspx?加上一個id,而這個id又來自哪里呢,答案就在***層網頁的響應數據中(見再下面一幅圖的紅色框)。

用Python爬取金融市場數據

用Python爬取金融市場數據

通過上面的分析,***層網頁的請求url由一個固定的部分加上一些數據,第二層網頁的url依賴于***層的數據,我們先在主函數中將url_1、url_2和一些可變的數據寫入(見上面的主函數),然后定義一個函數用來拼接兩層的url即可,因為***層網頁url的固定部分長度為47,第二層的為43,這里使用一個長度條件來判斷是拼接***層還是拼接第二層。

  1. # 定義第1個分函數joint,用來拼接url 
  2. def joint(url,size=None,page=None,type=None,id=None): 
  3.     if len(url) > 45: 
  4.         condition = 'producttype:' + type + '|status:在售' 
  5.         data = { 
  6.         'mode''statistics'
  7.         'pageSize'size
  8.         'pageIndex': str(page), 
  9.         'conditionStr': condition, 
  10.         'start_released'''
  11.         'end_released'''
  12.         'orderStr''1'
  13.         'ascStr''ulup' 
  14.         } 
  15.         joint_str = urllib.parse.urlencode(data) 
  16.         url_new = url + joint_str 
  17.     else
  18.         data = { 
  19.             'id':id 
  20.             } 
  21.         joint_str = urllib.parse.urlencode(data) 
  22.         url_new = url + joint_str 
  23.     return url_new 

③ 構建request + 獲取response一條龍 —— ***層和第二層通用

獲取url后,接下來就是構建request用來發送請求獲取響應了,此處定義一個函數實現一條龍服務。

這里為了提防反爬,user_agent在多個里隨機選,并使用了代理池(雖然不多),并且我電腦端也進行了局域網ip代理。

  1. # 定義第2個函數que_res,用來構建request發送請求,并返回響應response 
  2. def que_res(url): 
  3.  
  4.     # 構建request的***步——構建頭部:headers 
  5.     USER_AGENTS = [  
  6.         "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
  7.         "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"
  8.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"
  9.         "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
  10.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)"
  11.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)"
  12.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
  13.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)"
  14.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)"
  15.         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
  16.         ] 
  17.     user_agent = random.choice(USER_AGENTS) 
  18.     headers = { 
  19.         'Accept-Language''zh-CN,zh;q=0.8'
  20.         'Connection''keep-alive',  
  21.         'Host''www.某信托網.com'
  22.         'Referer''http://www.某信托網.com/Product/Index.aspx'
  23.         'User-Agent': user_agent, 
  24.         'X-Requested-With''XMLHttpRequest' 
  25.         } 
  26.  
  27.     # 構建request的第二步——構建request 
  28.     request = urllib.request.Request(url=url, headers=headers) 
  29.  
  30.  
  31.     # 發起請求的***步——構建代理池 
  32.     proxy_list = [       
  33.         {'http':'125.40.29.100:8118'}, 
  34.         {'http':'14.118.135.10:808'
  35.         ] 
  36.     proxy = random.choice(proxy_list) 
  37.  
  38.     # 發起請求的第二步——創建handler和opener 
  39.     handler = urllib.request.ProxyHandler(proxy) 
  40.     opener = urllib.request.build_opener(handler) 
  41.  
  42.     # 發起請求的第三步——發起請求,獲取響應內容并解碼 
  43.     response = opener.open(request).read().decode() 
  44.  
  45.     # 返回值 
  46.     return response 

④ 解析***層網頁的內容

獲取響應之后就是解析并提取數據了,***層使用正則表達式的方法來進行。

獲取的response如下如:

用Python爬取金融市場數據

因此可寫出如下正則,從左到右分配匹配出ID、產品名稱、發行機構、發行時間、產品期限、投資行業、首頁收益。

  1. # 定義第3個函數parse_content_1,用來解析并匹配***層網頁內容,此處使用正則表達式方法 
  2. def parse_content_1(response): 
  3.  
  4.     # 寫正則進行所需數據的匹配 
  5.     re_1 = re.compile( 
  6.     r'{"ROWID".*?"ID":"(.*?)","Title":"(.*?)","producttype".*?"issuers":"(.*?)","released":"(.*?) 0:00:00","PeriodTo":(.*?),"StartPrice".*?"moneyinto":"(.*?)","EstimatedRatio1":(.*?),"status":.*?"}'
  7.     contents = re_1.findall(response) 
  8.     return contents 

⑤ 解析第二層網頁的內容并輸出數據

第二層使用bs4中的select+選擇器的方法來進行。除了***層所提取的數據外,還需要發行地、收益分配方式、發行規模、***收益、***收益和利率等級分布情況。

網頁如下,可見,我們所需要的信息隱藏在一個又一個tr標簽里,而這個tr標簽處于id=“procon1”下的一個table標簽里(此處有個坑,就是從網頁來看,table下還有個tbody標簽,而實際得到的響應里并沒有)。

用Python爬取金融市場數據

由于我們不是所有的信息都要,所以我們可以一個一個的提取,最終輸出個數據。代碼如下(這中間用到了前面提到的選擇器知識和一些字符串處理方法):

  1. # 定義第4個函數parse_content_2,用來解析并匹配第二層網頁內容,并輸出數據,此處使用BeautifulSoup方法 
  2. def parse_content_2(response,content): 
  3.  
  4.     # 使用bs4進行爬取第二層信息 
  5.     soup = BeautifulSoup(response) 
  6.  
  7.     # 爬取發行地和收益分配方式,該信息位于id為procon1下的table下的第4個tr里 
  8.     tr_3 = soup.select('#procon1 > table > tr')[3] 
  9. address = tr_3.select('.pro-textcolor')[0].text 
  10. r_style = tr_3.select('.pro-textcolor')[1].text  
  11.  
  12.     # 爬取發行規模,該信息位于id為procon1下的table下的第5個tr里 
  13.     tr_4 = soup.select('#procon1 > table > tr')[4] 
  14. guimo = tr_4.select('.pro-textcolor')[1].text 
  15. re_2 = re.compile(r'.*?(\d+).*?', re.S)  
  16.     scale = re_2.findall(guimo)[0] 
  17.    # 爬取收益率,該信息位于id為procon1下的table下的第8個tr里 
  18.     tr_7 = soup.select('#procon1 > table > tr')[7] 
  19. rate = tr_7.select('.pro-textcolor')[0].text[:(-1)] 
  20. r = rate.split('至'
  21.   r_min = r[0] 
  22.     r_max = r[1] 
  23.  
  24.     # 提取利率等級 
  25.     tr_11 = soup.select('#procon1 > table > tr')[11] 
  26. r_grade = tr_11.select('p')[0].text 
  27.  
  28.     # 保存數據到一個字典中 
  29.     item = { 
  30.     '產品名稱':content[1], 
  31.     '發行機構':content[2], 
  32.     '發行時間':content[3], 
  33.     '產品期限':content[4], 
  34.     '投資行業':content[5], 
  35.     '首頁收益':content[6], 
  36.     '發行地': address, 
  37.     '收益分配方式': r_style, 
  38.     '發行規模': scale, 
  39.     '***收益': r_min, 
  40.     '***收益': r_max, 
  41.     '利率等級': r_grade 
  42.     } 
  43.  
  44.     # 返回數據 
  45.     return item 

⑥ 保存數據到本地(以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、爬取結果

運行代碼,這里以每頁顯示4個產品,爬取前3頁的信托在售為例,運行結果如下:

用Python爬取金融市場數據

然后打開存到本地的CSV文件如下:結果是美好的。

 

用Python爬取金融市場數據

這種兩層網頁的數據抓取,可以用在非常非常非常多的地方呦。

責任編輯:未麗燕 來源: 鼻歌三丁燕尾斬
相關推薦

2023-07-10 16:01:56

2022-05-19 14:27:44

人工智能金融市場基金

2018-03-07 17:00:51

2020-06-23 16:49:57

云計算金融市場云端

2012-04-19 14:44:45

梭子魚備份服務系統

2018-07-30 17:34:15

華為

2011-12-29 14:30:09

云計算

2022-01-07 16:40:07

區塊鏈證券數據

2017-07-05 11:53:45

民生銀行互聯網消費金融

2021-08-20 15:54:11

數字人民幣支付寶微信

2020-11-03 14:10:45

Python爬取天氣爬蟲

2021-04-30 10:24:49

量子計算芯片超算

2018-01-09 14:19:14

PythonAndroid爬蟲

2015-05-11 17:13:26

2022-07-12 09:55:34

Selenium爬取數據

2025-10-29 05:00:00

LLM智能體大語言模型

2022-01-20 16:42:10

加密貨幣比特幣數字資產

2019-01-11 10:22:31

Python數據爬取

2012-02-27 17:37:34

投資

2021-11-11 14:23:25

加密貨幣穩定幣貨幣
點贊
收藏

51CTO技術棧公眾號

中文字幕免费在线播放| av动漫在线免费观看| 日韩手机在线视频| 日韩在线不卡| 日韩美女视频在线| 99蜜桃臀久久久欧美精品网站| yw193.com尤物在线| 国产老肥熟一区二区三区| 91国偷自产一区二区三区的观看方式| 丰满圆润老女人hd| 欧美高清hd| 色视频成人在线观看免| 免费观看亚洲视频| 91在线直播| 99re成人在线| 欧美在线高清| 亚洲va天堂va国产va久| 日韩亚洲视频| 欧美一区二不卡视频| 免费看欧美女人艹b| 久久久噜噜噜久久| 91久久久久久久久久久久久久| 精品国产18久久久久久洗澡| 欧美日韩成人综合| 91传媒久久久| 国产探花视频在线观看| 国产精品免费观看视频| 久久av免费观看| 精品国产av 无码一区二区三区| 久久久久久久高潮| 97热在线精品视频在线观看| 国产麻豆视频在线观看| 欧美理论视频| 亚洲片国产一区一级在线观看| 亚洲色图欧美另类| 99久久99九九99九九九| 欧美三级三级三级爽爽爽| 日本免费不卡一区二区| av蜜臀在线| 亚洲图片欧美色图| 日韩精品久久一区二区| 美女免费久久| 国产精品乱码一区二区三区软件 | 欧美一区电影| 精品亚洲aⅴ在线观看| 亚洲国产精品狼友在线观看| 精品视频一区二区三区| 欧美久久久久久蜜桃| xxxx一级片| 日韩一区二区三区免费| 色偷偷成人一区二区三区91| 久久国产成人精品国产成人亚洲| 99久久精品免费看国产小宝寻花| 一区二区三区在线播| 日本中文字幕一级片| h片在线观看网站| 亚洲欧美日本国产| 久久97超碰国产精品超碰| 国产成人精品综合| 日本黄色一级视频| 日日摸夜夜添夜夜添精品视频| 91精品国产色综合久久不卡98口| 福利一区二区三区四区| 日韩午夜激情| 日韩免费av片在线观看| www五月天com| 久久黄色级2电影| 91日本视频在线| 成人免费一级视频| 91小视频在线观看| 视频一区二区三区免费观看| 午夜免费播放观看在线视频| 1区2区3区国产精品| 一道本在线观看视频| 在线免费观看的av| 午夜不卡av在线| 欧美日韩第二页| 成人在线免费电影网站| 欧美一区二区女人| 无码国产精品一区二区免费式直播 | 热久久免费视频精品| 国产精品尤物视频| 国精产品一区一区三区mba桃花| 91九色对白| 五月婷婷免费视频| 国产女人18毛片水真多成人如厕| 亚洲一区二区不卡视频| 污污的视频在线观看| 亚洲第一成人在线| 99久久国产宗和精品1上映| 国产一区二区色噜噜| 欧美大片一区二区| 色一情一交一乱一区二区三区| 四季av一区二区凹凸精品| 欧美激情综合色综合啪啪五月| 日韩黄色在线播放| 91精品人妻一区二区三区蜜桃2 | 国产污视频在线| 亚洲人妖av一区二区| 男人添女人下面高潮视频| www.久久.com| 精品伦理精品一区| 微拍福利一区二区| 亚洲精品社区| 成人写真福利网| 欧洲毛片在线| 亚洲精品免费在线| 五月天婷婷激情视频| 亚洲电影一区| 色偷偷综合社区| 日本免费观看视| 国产综合色视频| 欧美自拍资源在线| 123区在线| 欧美一区二区视频在线观看 | 欧美在线www| wwwav在线播放| 国产精品短视频| wwwxxx黄色片| 国产精品videossex| www.午夜精品| 中文字幕91爱爱| 26uuu成人网一区二区三区| 国产免费内射又粗又爽密桃视频| 国产乱子伦精品视频| 最新真实国产在线视频| 欧美性猛交xxxx| 日本不卡视频一区| 牛牛国产精品| 国产在线观看精品一区二区三区| 久久天堂电影| 欧美性69xxxx肥| 99久久免费看精品国产一区| 国内精品久久久久国产盗摄免费观看完整版| 国产精品99久久久久久白浆小说 | 有码中文亚洲精品| 日日夜夜综合网| 成人国产亚洲欧美成人综合网| 公共露出暴露狂另类av| 成人网ww555视频免费看| 亚洲精品国产美女| 精品无码久久久久| 国产宾馆实践打屁股91| 国产免费xxx| 四虎精品在线观看| 亚洲欧美国产精品久久久久久久| 久久久91视频| 丁香另类激情小说| 激情五月五月婷婷| 日韩欧美激情电影| 成年人精品视频| 97av在线视频| 亚洲 欧美 中文字幕| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产精品爽爽久久久久久| 国产精品全国免费观看高清| 最新中文字幕2018| 久久精品99久久无色码中文字幕| 国产精品偷伦视频免费观看国产 | 手机看片1024日韩| 五月天亚洲婷婷| 国产在线观看无码免费视频| 亚洲深爱激情| 欧美日韩综合久久| 欧美高清xxx| 欧美久久精品一级黑人c片| 国产av精国产传媒| 亚洲国产精品人人做人人爽| 538国产视频| 日韩1区2区日韩1区2区| 亚洲一区综合| 99久久人爽人人添人人澡| 久久久女人电视剧免费播放下载| 污污视频在线观看网站| 欧美视频在线免费看| 老熟妇一区二区| 精品亚洲porn| 黄页网站大全在线观看| 欧洲专线二区三区| 国产精品直播网红| 日韩伦理电影网站| 亚洲欧美色图片| 国产乱码精品一区二三区蜜臂| 亚洲自拍另类综合| 91久久免费视频| 国产精品一区二区不卡| 久色视频在线播放| 欧美激情成人| 国产亚洲精品美女久久久m| 亚洲成a人片| 成人一区二区视频| 国产精选久久久久久| 欧美人与性动交α欧美精品济南到| 亚洲国产中文字幕久久网| 欧美性受xxx黑人xyx性爽| 亚洲欧美国产77777| 一出一进一爽一粗一大视频| 久久精品国产第一区二区三区| 免费人成在线观看视频播放| 欧美日中文字幕| 国产精品对白刺激久久久| 久久野战av| 欧美激情手机在线视频 | 15—17女人毛片| 激情久久久久久久| 一区二区三区四区五区精品 | 一个人看的www久久| 粉嫩av一区二区夜夜嗨| 欧美性videosxxxxx| 国产大片中文字幕| 中文字幕日韩欧美一区二区三区| 午夜av免费看| 国产福利一区在线| 国产区二区三区| 中国女人久久久| 欧美tk丨vk视频| 最新天堂中文在线| 亚洲一区日韩| 日本香蕉视频在线观看| 91亚洲一区| 日韩中文一区| 午夜a一级毛片亚洲欧洲| 5566av亚洲| 成人动漫视频在线观看| 国产精品欧美在线| 电影一区二区三| 97视频免费在线观看| 亚洲性图自拍| 久久夜色精品国产亚洲aⅴ| av大片在线观看| 国产午夜精品一区二区三区| 亚洲av成人精品毛片| 精品国产91乱码一区二区三区| 国产美女明星三级做爰| 欧美亚一区二区| 亚洲中文一区二区| 91福利区一区二区三区| 黄色一级片免费在线观看| 亚洲国产精品久久一线不卡| 天天看片中文字幕| 亚洲女子a中天字幕| 亚洲伦理一区二区三区| 中文字幕综合网| 免费中文字幕日韩| 亚洲精品国产精华液| 欧美特级一级片| 亚洲美女在线一区| 欧美激情一区二区视频| 亚洲欧美另类久久久精品| 永久久久久久| 性一交一乱一伧老太| 日韩欧美高清视频| 亚洲黄色免费观看| 色吊一区二区三区| 日本黄色中文字幕| 欧美视频中文字幕| 中文字幕免费播放| 欧美日韩精品一二三区| 国产乱淫a∨片免费观看| 91精品久久久久久久99蜜桃 | 涩涩在线视频| 国产不卡av在线免费观看| 忘忧草在线www成人影院| 国产精品久久久av| av在线播放一区二区| 7777精品伊久久久大香线蕉语言| 玖玖玖视频精品| 国产成人看片| 伊人久久大香线蕉综合网站 | 国语精品一区| 国产91在线视频观看| 日韩av电影免费观看高清完整版| 国产无色aaa| 不卡视频免费播放| brazzers精品成人一区| 国产精品成人一区二区艾草| 久久免费小视频| 色综合久久中文综合久久97 | 精品国产一区二区三区久久影院 | www黄色av| 精品一区二区久久| 91丨porny丨对白| 国产女同互慰高潮91漫画| 青青草激情视频| 欧美性开放视频| 国产日韩欧美中文字幕| 亚洲国产精品电影| 自拍视频在线播放| 久久久久国产精品一区| 视频一区在线免费看| 97久草视频| 国产中文字幕一区二区三区| 成人在线观看毛片| 日韩精品一区第一页| 日本黄色一级网站| 久久九九久久九九| 成人免费毛片东京热| 国产精品一国产精品k频道56| 色婷婷久久一区二区| 免费日本一区二区三区视频| 992tv成人免费影院| 亚洲综合伊人| 欧美日韩一区二区三区免费| 欧美成人一品| 久久午夜夜伦鲁鲁一区二区| 成人妖精视频yjsp地址| 纪美影视在线观看电视版使用方法| 一级做a爱片久久| 亚洲精品无码久久久久| 亚洲黄色片网站| 成人日批视频| 国产精品久久视频| 青草久久视频| 亚洲爆乳无码精品aaa片蜜桃| 美腿丝袜亚洲综合| 国产+高潮+白浆+无码| 亚洲欧美在线aaa| 亚洲精品一区二区二区| 日韩电影网在线| 不卡av免费观看| 亚洲精品免费在线视频| 欧美系列电影免费观看| 女人喷潮完整视频| 懂色av一区二区三区蜜臀| www.97视频| 欧美日精品一区视频| 你懂的在线播放| 4438全国成人免费| youjizz亚洲| 精品人妻大屁股白浆无码| 激情综合色播五月| 91制片厂在线| 51精品视频一区二区三区| 97电影在线看视频| 国产精品高精视频免费| 九九久久电影| 国产欧美高清在线| 久久久久九九视频| 国产又大又粗又爽| 国产午夜精品一区二区三区| 中国字幕a在线看韩国电影| 国内视频一区二区| 一本色道久久综合| 水蜜桃av无码| 精品美女永久免费视频| 少妇无码一区二区三区| 国外成人性视频| 六月丁香久久丫| 内射国产内射夫妻免费频道| 97国产精品videossex| 性无码专区无码| 亚洲视频国产视频| 搜成人激情视频| 亚洲欧美成人一区| 精品一二三四区| 久久这里只有精品免费| 337p日本欧洲亚洲大胆精品| 捆绑调教日本一区二区三区| 鲁鲁视频www一区二区| 久久精品五月| 亚洲天堂岛国片| 在线电影一区二区三区| 日本三级韩国三级欧美三级| 国产一区二区中文字幕免费看| 国产精品永久| 亚洲第一视频区| 91精品在线麻豆| xxx在线免费观看| 欧美视频观看一区| 精品夜夜嗨av一区二区三区| 国产精品美女视频网站| 日韩精品一区二区三区免费视频| 国产黄色片免费在线观看| 久久综合成人精品亚洲另类欧美| 中日韩av在线| 毛片精品免费在线观看| 人妖一区二区三区| 狠狠躁狠狠躁视频专区| 亚洲精品videosex极品| 午夜视频福利在线观看| 国产精品一区二区在线| 国产精品va| 日本少妇xxxxx| 精品国精品自拍自在线| 亚洲伦乱视频| 国产爆乳无码一区二区麻豆| 国产无遮挡一区二区三区毛片日本| 91久久精品国产91性色69 | 久久久久久久极品内射| 亚洲免费一在线| 欧美成人精品一级| 国产三区在线视频| 亚洲精品一二三四区| 你懂的在线观看| julia一区二区中文久久94| 日本欧洲一区二区| 久久精品欧美一区二区| 在线播放日韩欧美| 欧美毛片免费观看| 日本一区二区三区在线免费观看|