爬取速卖通搜索页无法返回全部商品问题求助
问题:爬虫仅抓取16个商品,目标为60个
我用Python写了爬虫,想抓取AliExpress上的60个硅胶夜灯商品,但实际只返回16个。已经手动确认所有商品的类名一致(截图如下),但结果不符合预期。

原代码
from selenium import webdriver from selenium.webdriver.firefox.service import Service from webdriver_manager.firefox import GeckoDriverManager from bs4 import BeautifulSoup driver = webdriver.Firefox(service=Service(GeckoDriverManager().install())) url = 'https://www.aliexpress.com/w/wholesale-silicone-night-light.html?SearchText=silicone+night+light&catId=0&initiative_id=SB_20230101130255&spm=a2g0o.productlist.1000002.0&trafficChannel=main&shipFromCountry=US&g=y' driver.get(url) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") html = driver.page_source soup = BeautifulSoup(html, 'lxml') product_links = [] def get_element_title(element): return element.select('h1[class*="manhattan--titleText--"]')[0].text def get_product_links(soup): for element in soup.select('a[class*="manhattan--container--"]'): link = f"http:{element['href']}" product_links.append(link) print(get_element_title(element)) get_product_links(soup)
问题原因
AliExpress采用滚动加载机制,仅执行一次滚动到页面底部后立即获取源码,此时页面还没完成全部60个商品的加载,只加载了初始的16个(或当前可见的部分)。
解决方案
1. 循环滚动+等待,确保所有商品加载完成
通过循环滚动页面,每次滚动后等待一段时间,直到页面高度不再变化(说明没有新内容加载),再抓取源码。
2. 显式等待元素加载
使用Selenium的WebDriverWait等待商品元素加载完成,避免过早抓取。
3. 修正链接拼接逻辑
原代码中http:{element['href']}可能导致链接错误,AliExpress的链接是HTTPS协议,直接拼接https:或使用完整的element.get_attribute('href')更可靠。
修改后的代码示例
from selenium import webdriver from selenium.webdriver.firefox.service import Service from webdriver_manager.firefox import GeckoDriverManager from bs4 import BeautifulSoup import time driver = webdriver.Firefox(service=Service(GeckoDriverManager().install())) url = 'https://www.aliexpress.com/w/wholesale-silicone-night-light.html?SearchText=silicone+night+light&catId=0&initiative_id=SB_20230101130255&spm=a2g0o.productlist.1000002.0&trafficChannel=main&shipFromCountry=US&g=y' driver.get(url) time.sleep(2) # 初始等待页面加载 # 循环滚动直到页面高度不再变化 last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(3) # 等待新内容加载,可根据网速调整 new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height html = driver.page_source soup = BeautifulSoup(html, 'lxml') product_links = [] def get_element_title(element): return element.select_one('h1[class*="manhattan--titleText--"]').text def get_product_links(soup): for element in soup.select('a[class*="manhattan--container--"]'): # 优化链接拼接,避免协议错误 link = element.get('href') if not link.startswith('http'): link = f"https:{link}" product_links.append(link) print(get_element_title(element)) get_product_links(soup) print(f"共抓取到{len(product_links)}个商品链接") driver.quit()
关键说明
- 滚动后的等待时间可根据网络情况调整,避免等待过短导致加载不完整
- 使用
select_one替代select()[0],避免索引越界报错 - 链接处理逻辑优化,确保生成有效的HTTPS链接
内容的提问来源于stack exchange,提问作者Yousef
相关产品推荐
相关产品推荐

