如何爬取无限滚动/点击加载更多网页?Selenium被反爬如何限制最大爬取页数?
无限滚动网页爬取最大页数限制方案及优化建议
限制最大页数的实现方法
你现有代码的循环仅判断「加载更多」按钮是否存在,仅需在循环判断条件中增加最大页数阈值即可实现页数控制。比如你需要最多爬取10页,修改逻辑如下:
- 先定义最大页数常量,可根据实际需求调整数值
- 修改while循环条件,同时满足「存在加载更多按钮」、「当前页数未达最大阈值」两个条件时才继续执行
修改后的代码片段示例:
from selenium import webdriver import time import pandas as pd from bs4 import BeautifulSoup import random url = 'https://www.bloomberg.com/search?query=indonesia%20mining' options = webdriver.ChromeOptions() options.add_argument("start-maximized") options.add_argument("disable-infobars") options.add_argument("--disable-extensions") # 新增反爬配置,避免被识别为机器人 options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36') options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False) driver = webdriver.Chrome(options=options) driver.get(url) html = driver.page_source.encode('utf-8') # 自定义最大爬取页数 MAX_PAGE = 10 page_num = 0 while page_num < MAX_PAGE and driver.find_elements_by_css_selector('.contentWell__a8d28605a5'): driver.find_element_by_css_selector('.contentWell__a8d28605a5').click() page_num += 1 print("getting page number "+str(page_num)) # 替换固定等待为随机时长等待,模拟真人操作间隔 time.sleep(random.uniform(2, 5)) html = driver.page_source.encode('utf-8') soup = BeautifulSoup(html, 'lxml') titles = soup.find_all('div', {"class":"text__d88756958e withThumbnail__c4ffc902a6"}) df = pd.DataFrame(columns=['judul', 'link']) news_list = [] for t in titles: news = {} news['judul'] = t.find('a', {'class':'headline__96ba1917df'}).text.strip() news['link'] = t.find('a', {'class':'headline__96ba1917df'}).get('href') news_list.append(news) # 替换已废弃的append方法为concat,避免版本兼容问题 df = pd.concat([df, pd.DataFrame(news_list)], ignore_index=True)
额外优化说明
- 代码中新增了反爬相关的配置,可降低被网站识别为机器人的概率
- 固定等待改为随机间隔,更符合真人操作的行为特征
- 调整了数据拼接逻辑,替换了高版本pandas已经废弃的
append方法,避免运行报错 - 爬取过程中注意控制频率,遵守目标网站的爬取规则
内容的提问来源于stack exchange,提问作者ohai
相关产品推荐
相关产品推荐

