我有下面的代码,我希望返回60个产品,但只返回16:
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)
我手动检查了所有产品的类名,因为我想也许其中一些产品有不同的类名,以努力停止刮取,但它们都有相同的类名。
2条答案
按热度按时间tf7tbtn21#
没有找到所有产品的原因是因为它们只有在你滚动过它们时才会出现。为了实现这一点,我们可以运行一些javascript代码,一次滚动一个窗口高度,直到文档结束。另外,与其使用
BeautifulSoup
进行抓取,为什么不直接使用Selenium
本身来查找这些元素,使用driver.find_elements
通过CSS选择器来查找这些元素呢?其中标记名以标识的字符串模式开头(即use ^=)。下面是完整的代码:
用给定的URL启动这个,它能够找到所有60个产品。下面显示一些输出摘录:
j8ag8udp2#
这里有一种方法可以直接抓取API端点(你可以在开发工具-网络选项卡中找到),而不需要Selenium的开销。JSON响应和生成的 Dataframe 包含了丰富的信息,包括产品链接等:
最终结果: