Immortal463 2023-02-27 15:28 采纳率: 37.5%
浏览 52
已结题

python爬虫爬到中间报错

爬虫爬到371页就无法继续了,显示list index out of range


```python
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


# 实例化一个浏览器对象
bro = webdriver.Chrome(executable_path='./chromedriver')
# 让浏览器发起一个指定url的请求
bro.get('http://vip.stock.finance.sina.com.cn/fund_center/index.html#hbphall')

# 获取浏览器当前界面的动态页面源码数据
page_text = bro.page_source
# 解析企业名称
soup = BeautifulSoup(page_text, "html.parser")

# 建立空列表
list_ji = []

# 开始爬取数据
for i in range(1, 3, 1):
    if i <= 414:
        j = 0
        for j in range(0, 40, 1):
            l1 = soup.find_all('tr', class_='red')
            list_ji.append(get_row(l1[j]))

        # 翻页
        next_button = bro.find_element(By.LINK_TEXT, '下一页')
        actions = ActionChains(bro)
        actions.click(next_button).perform()
        # 获取浏览器当前界面的动态页面源码数据
        page_text = bro.page_source
        # 解析企业名称
        soup = BeautifulSoup(page_text, "html.parser")

    else:
        for k in range(0, 30, 1):
            l1 = soup.find_all('tr', class_='red')
            list_ji.append(get_row(l1[k]))

column = ["基金代码", "基金名称", "单位净值", "累计净值", "近三个月(%)", "近六个月(%)", "近一年(%)",
          "今年以来(%)", "成立以来(%)"]
result = pd.DataFrame(list_ji, columns=column)
pd.set_option('display.max_rows', None)  # 显示pandas所有行
# result.columns = ["基金代码", "基金名称", "单位净值", "累计净值", "近三个月(%)", "近六个月(%)", "近一年(%)", "今年以来(%)", "成立以来(%)"]
print(result)
bro.quit()

```

  • 写回答

3条回答 默认 最新

  • Dick_不周 2023-02-27 16:47
    关注

    ..谢邀。
    页数有点多,就不跑完测了。
    报错是list index out of range,如果是在371页报的错,跟最后一页条数不够没啥关系。
    那首先317页和316页有啥区别? 是317页就不够40条了?这也不符合大众的设计思路。
    那可能是在翻页的过程中,网页的响应速度变慢,页面没加载出来,l1为空,自然不存在40位的list.
    如何解决呢?
    相应的解决办法也有很多,例如隐式等待20或30秒

    bro.implicitly_wait(30)
    

    更详尽(稳定)的办法是每到新的一页,判断最后一行元素是否存在(1-416为 l1[39] , 最后一页还得看一眼)
    如果存在,执行下一步,不存在,等10秒再判断是否存在,还不存在刷新页面(还会停留在当前页数)。

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

报告相同问题?

问题事件

  • 系统已结题 3月7日
  • 已采纳回答 2月27日
  • 创建了问题 2月27日