python+selenium爬取动态表格 ,以天天基金的基金排名为例

1.天天基金网站

天天基金排行榜:
python+selenium爬取动态表格 ,以天天基金的基金排名为例_第1张图片

2.看一下数据的格式

python+selenium爬取动态表格 ,以天天基金的基金排名为例_第2张图片
上图可以看到85.11%那个表格对应的是右边的标签。且该表格是动态,不能直接用request.get(url)来获取,最重要的是,我们要爬取所有的排行榜的话需要点击下一页,而该网站点击下一页的时候,其url不会变化,所以用selenium比较合适。

3.找到对应的xpath

右键上图的标签->copy->copy xpath

4.selenium操作

这里主要讲一下模拟点击操作,一般情况下是点击下一页,按页数爬取。但我发现该页面有一个按钮叫‘不分页’,这样可以省去模拟点击次数,但还是需要用模拟点击操作对不分页按钮进行点击。
点击代码是

element = driver.find_element_by_xpath('//*[@id="showall"]')               #不分页
ActionChains(driver).click(element).perform()

简单说就是找到按钮对应的xpath,传入函数,再对element进行一个点击。

5.完整代码

# -*- coding: utf-8 -*-
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
import csv

url = 'http://fund.eastmoney.com/data/fundranking.html#tall;c0;r;szzf;pn50;ddesc;qsd20181208;qed20191208;qdii;zq;gg;gzbd;gzfs;bbzt;sfbb'
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
#driver = webdriver.Chrome()
driver.get(url)
data = []
print('-----------------开始爬虫操作-----------------')
time.sleep(8)
element = driver.find_element_by_xpath('//*[@id="showall"]')               #不分页
ActionChains(driver).click(element).perform()
time.sleep(13)
for i in range(1,5461):
    try:
        xuhao = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[2]').text
        num = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[3]').text
        name = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[4]').text
        date = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[5]').text
        danweijingzhi = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[6]').text
        leijijingzhi = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[7]').text
        day_grow = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[8]').text
        week_grow = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[9]').text
        month_grow = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[10]').text
        three_month_grow = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[11]').text
        six_month_grow = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[12]').text
        year_grow = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[13]').text
        two_year_grow = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[14]').text
        three_year_grow = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[15]').text
        all_grow = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[17]').text
        fee = driver.find_element_by_xpath('//*[@id="dbtable"]/tbody/tr[' + str(i) + ']/td[19]').text
        temp = []
        temp.append(xuhao)
        temp.append(num)
        temp.append(name)
        temp.append(date)
        temp.append(danweijingzhi)
        temp.append(leijijingzhi)
        temp.append(day_grow)
        temp.append(week_grow)
        temp.append(month_grow)
        temp.append(three_month_grow)
        temp.append(six_month_grow)
        temp.append(year_grow)
        temp.append(two_year_grow)
        temp.append(three_year_grow)
        temp.append(all_grow)
        temp.append(fee)
        data.append(temp)
    except :
        print('找不到元素,爬取结束')
        i = i-1
        continue    #若因为反爬虫爬取失败,则继续当前轮次的爬取
    print('当前正在爬取第'+str(i+1)+'页')

demo = []
demo.append('序号')
demo.append('基金编号')
demo.append('基金名称')
demo.append('日期')
demo.append('单位净值')
demo.append('累计净值')
demo.append('日增长')
demo.append('周增长')
demo.append('月增长')
demo.append('3个月增长')
demo.append('6个月增长')
demo.append('年增长')
demo.append('两年增长')
demo.append('三年增长')
demo.append('总体增长')
demo.append('购买费率')
data.append(demo)
with open(r'E:\安装包\天天基金数据爬取\FundCrawler-master/dataset.csv', 'w', newline='') as csvfile:
    writer  = csv.writer(csvfile)
    for row in data:
        writer.writerow(row)
#print(xpath)

6.爬取效果

python+selenium爬取动态表格 ,以天天基金的基金排名为例_第3张图片
欢迎转载,有问题下方评论区留言。

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