BeautifulSoup仅抓取第一页求助:多页重复获取首页内容
解决爬取时重复获取第一页内容的问题
问题根源
你遇到的情况是典型的反爬拦截:浏览器访问时会自动携带User-Agent、会话Cookie等请求头信息,服务器靠这些识别正常用户;而requests.get()默认的请求头过于简单,被服务器判定为非正常访问,直接返回默认的第一页内容,不管你修改page参数还是抓下一页链接都没用。
另外,抓下一页链接的代码还有个小问题:页面里的href大概率是相对路径,直接赋值给next_page会导致请求地址错误。
解决方案
- 添加模拟浏览器的请求头:至少要带上
User-Agent,最好复制浏览器访问该页面时的Cookie(从浏览器开发者工具的Network面板获取)。 - 处理相对路径:用
urllib.parse.urljoin把页面里的相对链接拼接成完整URL。 - 验证请求有效性:每次请求后打印响应状态码和URL,确认服务器是否返回了目标页面。
修改后的代码示例
方案1:通过URL参数遍历页面
import requests from bs4 import BeautifulSoup # 替换成你浏览器的真实请求头,从Network面板复制 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Cookie': '这里替换成你浏览器访问该页面时的Cookie内容' } product_links = [] # 测试爬取前2页,实际替换为page_count对应的范围 for count in range(1, 3): page_url = f'https://www.bargainw.com/wholesale/1082/Wholesale-Products.html?sort=&size=100&page={count}&sortBy=' product_response = requests.get(page_url, headers=headers, timeout=3) # 打印请求状态和URL,排查问题 print(f"请求状态码:{product_response.status_code},当前请求URL:{product_response.url}") soup = BeautifulSoup(product_response.text, 'html5lib') products = soup.find_all('div', class_='product_name') print('-'*200) print(f'正在打印 {page_url} 的内容') print('-'*200) for product in products: print(count, product.contents[1]) product_links.append(product.contents[1].get('href'))
方案2:抓取下一页按钮链接
import requests from bs4 import BeautifulSoup from urllib.parse import urljoin headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Cookie': '这里替换成你浏览器访问该页面时的Cookie内容' } base_url = 'https://www.bargainw.com' next_page = '/wholesale/1082/Wholesale-Products.html?sort=&size=100&page=1&sortBy=' product_links = [] # 测试爬取前2页,实际替换为page_count对应的范围 for count in range(1, 3): full_url = urljoin(base_url, next_page) product_response = requests.get(full_url, headers=headers, timeout=3) print(f"请求状态码:{product_response.status_code},当前请求URL:{product_response.url}") soup = BeautifulSoup(product_response.text, 'html5lib') products = soup.find_all('div', class_='product_name') print('-'*200) print(f'正在打印 {full_url} 的内容') print('-'*200) for product in products: print(count, product.contents[1]) product_links.append(product.contents[1].get('href')) # 获取下一页链接并处理相对路径 next_page_tag = soup.find('a', class_='pageNavLink pageNavNext') if next_page_tag: next_page = next_page_tag.get('href') else: print('已到最后一页,停止爬取') break
额外提示
- Cookie可能会过期,需要定期从浏览器更新;也可以先请求一次首页,保存响应的
cookies对象,后续请求复用。 - 不要过度频繁请求,可添加
time.sleep(1)控制间隔,避免被封IP。
内容的提问来源于stack exchange,提问作者dshin
相关产品推荐
相关产品推荐

