Immortal463 2023-03-13 12:46 采纳率: 37.5%
浏览 37
已结题

python爬虫爬到331页无法继续


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页就没法继续了,请求帮助。

img

  • 写回答

4条回答 默认 最新

  • 牟柯丞 2023-03-13 13:56
    关注

    当前页提取列表数据超出索引,这也不是什么报错,当你列表里面没东西或者索引值超过了列表元素的时候就会出现这个问题,
    就是你爬到的这页,抓取的这个列表值,里面没东西或者东西太少。所以报错了。
    建议你换个网站爬取那个年份的内容或者就忽略掉它,看看这个网站331页的结构,重新编写爬虫程序。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 修改了问题 3月13日
  • 创建了问题 3月13日