[原创][爬虫学习·一]爬取天天基金网的基金收益排行信息

[原创][爬虫学习·一]爬取天天基金网的基金收益排行信息

最近在学习爬虫,实验了几个简单的小demo,记录一二。

首先我们打开天天基金网的基金收益排行页面,了解一下要爬取的页面,网址和截图如下:

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

[原创][爬虫学习·一]爬取天天基金网的基金收益排行信息_第1张图片

 

现在要爬取该页面下所有基金的代码、名称、日增长率、近一周和近一月的增长率(也就是红框内的内容),并保存在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张图片

(2)分析页面和爬取网站内容。

选取Selenium爬取工具,模拟浏览器对该网址发出请求。如果没有安装该工具,通过在cmd中执行

pip install selenium

安装selenium,并在python文件中通过

from selenium import webdriver

引入webdriver。之后需要下载chromedriver.exe,在Chrome浏览器中,输入chrome://version/,查看版本。

[原创][爬虫学习·一]爬取天天基金网的基金收益排行信息_第3张图片

下载对应的驱动:

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开发者工具,如下:

[原创][爬虫学习·一]爬取天天基金网的基金收益排行信息_第4张图片

 

观察可知,所有基金的信息,都位于类名为mainTb的table标签中,且每一栏基金的信息由table标签下属的tbody标签下的一个tr标签描述,而日、月、周增长率信息,则由tr标签下的td标签描述。层级关系为:


            ...
        
            ...
        
        ...    
    

我们注意到,基金的日、周、月增长率的数据,分别为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文件,内容如下:

[原创][爬虫学习·一]爬取天天基金网的基金收益排行信息_第5张图片

爬取成功!

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')

 

你可能感兴趣的:(爬虫)