from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from lxml import etree
from time import sleep
import pandas as pd
from bs4 import BeautifulSoup
def get_row(li):
list1 = []
l1_1 = li.find_all('a', limit=2)
l1_2 = li.find_all('th')
for x in l1_1:
list1.append(x.string)
for y in l1_2:
list1.append(y.string)
return list1
# 实例化一个浏览器对象
wd = webdriver.Chrome(executable_path='./chromedriver')
# 让浏览器发起一个指定url的请求
wd.get('http://vip.stock.finance.sina.com.cn/fund_center/index.html#hbphall')
# 设置隐式等待时间
wd.implicitly_wait(20)
# 获取浏览器当前界面的动态页面源码数据
page_text = wd.page_source
# 解析企业名称
soup = BeautifulSoup(page_text, "html.parser")
# 建立空列表
list_ji = []
### 最大页码
max_page = wd.find_element(By.XPATH,'//*[@id="pHBPH"]/a[3]').text
### 检测测数据是否加载完成
def data_exsist():
# 获取浏览器当前界面的动态页面源码数据
page_text = wd.page_source
# 解析企业名称
soup = BeautifulSoup(page_text, "html.parser")
if soup.find_all('tr',class_='red') :
global list_ji
l1 =soup.find_all('tr',class_ = 'red')
for j in range(0,40) :
list_ji.append(get_row(l1[j]))
else:
time.sleep(10)
if soup.fin_all('tr', class_='red'):
l1 = soup.find_all('tr', class_='red')
for j in range(0, 40, 1):
list_ji.append(get_row(l1[j]))
else:
wd.refresh()
time.sleep(5)
data_exsits()
### 主程序
def get_all_data() :
global wd,list_ji ###声明全局变量
for i in range(1,int(max_page)+1) :
if i != int(max_page)-1 :
data_exsist()
print(f'当前第{i}页')
wd.find_element(By.LINK_TEXT, '下一页').click()
else :
l1 = soup.find_all('tr', class_='red')
for line in (0,40) :
try :
list_ji.append(get_row(l1[j]))
except Exception :
break
###报错就说明所有数据都拿完了,直接退出即可
get_all_data()
column = ["基金代码", "基金名称", "单位净值", "累计净值", "近三个月(%)", "近六个月(%)", "近一年(%)",
"今年以来(%)", "成立以来(%)"]
result = pd.DataFrame(list_ji, columns=column)
pd.set_option('display.max_rows', None) # 显示pandas所有行
# result.columns = ["基金代码", "基金名称", "单位净值", "累计净值", "近三个月(%)", "近六个月(%)", "近一年(%)", "今年以来(%)", "成立以来(%)"]
print(result)
wd.quit()
总是爬取到331页就没法继续了,请求帮助。