抓取eBay商品页面时如何过滤指向错误页的无效链接?
解决方法
1. 优化选择器,从源头避免抓取无效推广链接
你当前使用的li a选择器范围太宽泛,会命中搜索结果顶部的赞助推广位链接(也就是你遇到的错误链接的主要来源)。eBay正常商品列表的链接有固定类名,修改选择器即可过滤绝大多数无效链接:
把listings = soup.select("li a")修改为listings = soup.select("li.s-item a.s-item__link")
2. 增加链接参数过滤规则
错误的推广链接一般带有_trkparms、ispr=这类特殊追踪参数,正常商品详情页链接仅包含基础商品ID路径,你可以在循环中增加过滤规则:
for a in listings: link = a["href"] if link.startswith("https://www.ebay.com/itm/"): # 过滤带推广参数的无效链接 if "_trkparms" in link or "ispr=" in link: continue page = browser.get(link)
3. 访问后校验页面有效性(兜底方案)
如果仍有漏网的错误链接,可以在页面加载完成后判断是否存在错误页元素,存在则直接跳过处理:
import time import requests from bs4 import BeautifulSoup from selenium import webdriver from selenium.common.exceptions import NoSuchElementException browser = webdriver.Chrome('/Users/admin/eBay/chromedriver') url = "https://www.ebay.com/sch/i.html?_from=R40&_trksid=p2380057.m570.l1313&_nkw=New+Big+Frame+Square+Sunglasses+Fashion+Trend+All-match+Women%27s+Sunglasses+Cross-border+Hot+Sale+Sunglasses&_sacat=0" r = requests.get(url) soup = BeautifulSoup(r.content, features="lxml") # 用优化后的选择器 listings = soup.select("li.s-item a.s-item__link") for a in listings: link = a["href"] if link.startswith("https://www.ebay.com/itm/"): # 第一层过滤:过滤带推广参数的链接 if "_trkparms" in link or "ispr=" in link: continue browser.get(link) # 第二层校验:判断是否为错误页 try: browser.find_element_by_xpath("//*[@id='wrapper']/div[1]/div/div/p") # 能找到错误元素说明是无效页,跳过后续处理 continue except NoSuchElementException: # 无错误元素,是正常商品页,执行你的后续逻辑 pass
内容的提问来源于stack exchange,提问作者hAgEnTER
相关产品推荐
相关产品推荐

