使用BeautifulSoup爬取立创商城分页数据时重复获取内容的问题
问题分析
你的代码爬取重复数据的核心原因是分页参数设置错误:
- 立创商城列表页的分页参数是
pageNumber,但你在循环中错误地给params添加了page键,且初始params里的pageNumber被固定设为传入的pages值(比如调用get_some_pages(3)时,pageNumber一开始就是3)。 - 这导致每次请求都在获取第3页的数据,循环3次就得到了3组完全相同的内容。
修正方案
- 移除初始
params里错误的pageNumber : pages设置,改为在循环中动态设置pageNumber参数 - 优化DataFrame拼接方式:用列表存储每行数据,最后一次性转为DataFrame,比循环
pd.concat效率更高
修正后的代码:
import pandas as pd import requests from bs4 import BeautifulSoup import time def get_some_pages(pages): headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Mobile Safari/537.36'} params = {'catalogNodeId': 313} url = 'https://list.szlcsc.com/catalog/431.html' data_list = [] # 用列表存储数据,提升效率 for page in range(1, pages+1): params['pageNumber'] = page # 正确设置分页参数 res = requests.get(url, headers=headers, params=params) time.sleep(10) soup = BeautifulSoup(res.text, 'html.parser') all_cat_list = soup.find_all('tr', {'class': 'no-tj-tr add-cart-tr'}) for cat_list in all_cat_list: name = cat_list.select_one('div.two-tit a').text.strip() link = cat_list.select_one('div.two-tit a').get('href') kolvo = cat_list.select_one('div.stock-nums-js span').text.strip() price = cat_list.select_one('div.price-warp-local span').get('orderprice') row = { 'name': name, 'link': link, 'kolvo': kolvo, 'price': price, 'rub': float(price)*1.6 } data_list.append(row) return pd.DataFrame(data_list).reset_index(drop=True) # 调用测试 result = get_some_pages(3) print(result)
额外说明
- 移除了未使用的
urllib.parse、xlrd、re库,精简依赖 - 简化了
select_one的链式调用,直接用div.two-tit a更简洁 - 用列表存储数据后再转DataFrame,避免了循环拼接DataFrame带来的性能损耗
内容的提问来源于stack exchange,提问作者Евгений Еремеев
相关产品推荐
相关产品推荐

