[原創][爬蟲學習·一]爬取天天基金網的基金收益排行信息

[原創][爬蟲學習·一]爬取天天基金網的基金收益排行信息

最近在學習爬蟲,實驗了幾個簡單的小demo,記錄一二。

首先我們打開天天基金網的基金收益排行頁面,瞭解一下要爬取的頁面,網址和截圖如下:

http://fund.eastmoney.com/trade/hh.html?spm=001.1.swh#zwf_,sc_1n,st_desc

 

現在要爬取該頁面下所有基金的代碼、名稱、日增長率、近一週和近一月的增長率(也就是紅框內的內容),並保存在Excel文件中。思路如下,

(1)設置Excel文件的格式。

1)引入xlwt工具

import xlwt

2)添加FundSheet頁,並設置Excel文件的表頭,用的是worksheet.write(row,col,label)方法,row爲excel表的行,col爲列,label是表格內容。

workbook = xlwt.Workbook(encoding ='utf-8')
worksheet = workbook.add_sheet('FundSheet')
worksheet.write(0, 0, label='基金代碼')
worksheet.write(0, 1, label='基金名稱')
worksheet.write(0, 2, label='日增長率')
worksheet.write(0, 3, label='周增長率')
worksheet.write(0, 4, label='月增長率')

這幾行代碼的設置效果如下:

(2)分析頁面和爬取網站內容。

選取Selenium爬取工具,模擬瀏覽器對該網址發出請求。如果沒有安裝該工具,通過在cmd中執行

pip install selenium

安裝selenium,並在python文件中通過

from selenium import webdriver

引入webdriver。之後需要下載chromedriver.exe,在Chrome瀏覽器中,輸入chrome://version/,查看版本。

下載對應的驅動:

http://chromedriver.storage.googleapis.com/index.html

將下載好的chromedriver.exe放置在合適的路徑,如:

D:\anaconda\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe

之後通過co.headless=False語句,設置在可視化的界面下調試,如果設置爲True,爬蟲運行時就看不到瀏覽器界面了。

聲明chromedriver.exe的啓動路徑(上一步設置的路徑)和基金排行的url。使用browser對象的get方法打開url。

co = webdriver.ChromeOptions()
#是否有瀏覽界面,False:有;True:無
co.headless = False 
#chrome_driver路徑
chrome_driver = r'D:\anaconda\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe'
browser = webdriver.Chrome(executable_path=chrome_driver, options=co)
#基金排行的url
url = 'http://fund.eastmoney.com/trade/hh.html?spm=001.1.swh#zwf_,sc_1n,st_desc'
browser.get(url)

在彈出的瀏覽器界面,打開F12開發者工具,如下:

 

觀察可知,所有基金的信息,都位於類名爲mainTb的table標籤中,且每一欄基金的信息由table標籤下屬的tbody標籤下的一個tr標籤描述,而日、月、周增長率信息,則由tr標籤下的td標籤描述。層級關係爲:

<table>
    <tbody>
        <tr><!- 基金1 ->
            <td><!- 基金1的日增長率 -></td>
            <td><!- 基金1的周增長率 -></td>
            ...
        </tr>
        <tr><!- 基金2 ->
            <td><!- 基金2的日增長率 -></td>
            <td><!- 基金2的周增長率 -></td>
            ...
        </tr>
        ...    
    </tbody>
</table>

我們注意到,基金的日、周、月增長率的數據,分別爲tr標籤下的第4、5、6個td標籤,因此,需要用CSS選擇器對其進行選擇,語法爲

'p:nth-child(n)'

其中p爲標籤名稱,n爲第幾個p標籤。如選擇第四個td標籤,在Python中就可以寫爲:

day_increase = fund.find_element_by_css_selector('td:nth-child(4)')

總之,寫出爬蟲代碼如下:

mainTb = browser.find_element_by_class_name('mainTb')
tbody = mainTb.find_element_by_tag_name('tbody')
funds = tbody.find_elements_by_tag_name('tr')
#excel文件的行
row = 1
#excel文件的列
col = 0
for fund in funds:
        fund_code = fund.find_element_by_tag_name('td')
        fund_name = fund.find_element_by_class_name('fname')
        a_fund_name = fund_name.find_element_by_tag_name('a')
        #通過CSS樣式選擇器選擇第n個td標籤
        day_increase = fund.find_element_by_css_selector('td:nth-child(4)')
        week_increase = fund.find_element_by_css_selector('td:nth-child(5)')
        month_increase = fund.find_element_by_css_selector('td:nth-child(6)')
        worksheet.write(row, col, label=fund_code.text)
        worksheet.write(row, col+1, label=a_fund_name.text)
        worksheet.write(row, col+2, label=day_increase.text)
        worksheet.write(row, col+3, label=week_increase.text)
        worksheet.write(row, col+4, label=month_increase.text)
        row += 1
workbook.save('Fund_Excel_test.xls')

解釋一下,通過browser的尋找類名方法,找到類名爲mainTb的table元素,再找到該table元素下的tbody標籤,之後找到tbody標籤下的tr標籤集合,注意find_elements和find_element的區別。

之後解析集合中的每一個fund信息,找到基金的代碼、名稱和增長率,將這些信息寫入Excel文件,最後保存。

爬取完成後,在項目目錄下就生成了Fund_Excel_test.xls文件,打開該Excel文件,內容如下:

爬取成功!

demo的完整代碼如下:

import xlwt
from selenium import webdriver
workbook = xlwt.Workbook(encoding ='utf-8')
worksheet = workbook.add_sheet('FundSheet')
worksheet.write(0, 0, label='基金代碼')
worksheet.write(0, 1, label='基金名稱')
worksheet.write(0, 2, label='日增長率')
worksheet.write(0, 3, label='周增長率')
worksheet.write(0, 4, label='月增長率')
co = webdriver.ChromeOptions()
#是否有瀏覽界面,False:有;True:無
co.headless = False
#chrome_driver路徑
chrome_driver = r'D:\anaconda\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe'
browser = webdriver.Chrome(executable_path=chrome_driver, options=co)
#基金排行的url
url = 'http://fund.eastmoney.com/trade/hh.html?spm=001.1.swh#zwf_,sc_1n,st_desc'
browser.get(url)
mainTb = browser.find_element_by_class_name('mainTb')
tbody = mainTb.find_element_by_tag_name('tbody')
funds = tbody.find_elements_by_tag_name('tr')
#excel文件的行
row = 1
#excel文件的列
col = 0
for fund in funds:
        fund_code = fund.find_element_by_tag_name('td')
        fund_name = fund.find_element_by_class_name('fname')
        a_fund_name = fund_name.find_element_by_tag_name('a')
        #通過CSS樣式選擇器選擇第n個td標籤
        day_increase = fund.find_element_by_css_selector('td:nth-child(4)')
        week_increase = fund.find_element_by_css_selector('td:nth-child(5)')
        month_increase = fund.find_element_by_css_selector('td:nth-child(6)')
        worksheet.write(row, col, label=fund_code.text)
        worksheet.write(row, col+1, label=a_fund_name.text)
        worksheet.write(row, col+2, label=day_increase.text)
        worksheet.write(row, col+3, label=week_increase.text)
        worksheet.write(row, col+4, label=month_increase.text)
        row += 1
workbook.save('Fund_Excel_test.xls')

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章