使用BeautifulSoup无法爬取ercotires网站全部HREF链接求助
解决爬取ercotires.com链接无结果的问题
爬取时拿不到链接,大概率是这几个原因:
- 网站用JavaScript动态加载产品列表,requests只能拿到初始空框架,没加载出实际链接
- 请求头太简单,被反爬机制拦截,返回的内容不完整
- 直接找所有
<a>标签范围太宽,没精准定位到产品链接
下面是具体解决办法:
先确认请求是否拿到有效页面
先补充关键请求头,然后打印响应内容,排查是否被拦截:
import requests headers = { 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Referer': 'https://www.ercotires.com/tienda/' } r = requests.get('https://www.ercotires.com/tienda/?swoof=1&paged=1', verify=False, headers=headers) print(r.status_code) # 正常应该返回200 print(r.text[:500]) # 查看前500字是否为产品页面内容,不是则说明被拦截
如果状态码不是200,或返回验证码、反爬提示,需要调整请求头或使用代理。
精准定位产品链接
如果页面存在静态链接,不要全局查找<a>,直接定位电商站常用的产品链接容器(比如woocommerce-loop-product__link类名):
import requests from bs4 import BeautifulSoup headers = { 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Referer': 'https://www.ercotires.com/tienda/' } for x in range(1,6): r = requests.get(f'https://www.ercotires.com/tienda/?swoof=1&paged={x}', verify=False, headers=headers) soup = BeautifulSoup(r.text, 'html.parser') # 仅抓取产品专属链接 product_links = soup.find_all('a', class_='woocommerce-loop-product__link') for link in product_links: print(link.get('href'))
处理动态加载的情况
如果上述方法无效,说明页面是JavaScript动态渲染的,用Selenium模拟浏览器加载完整页面:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options import time # 配置无头模式,无需打开可视化浏览器窗口 options = Options() options.add_argument('--headless=new') options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36') driver = webdriver.Chrome(options=options) for x in range(1,6): url = f'https://www.ercotires.com/tienda/?swoof=1&paged={x}' driver.get(url) time.sleep(2) # 等待页面加载完成 # 抓取产品链接 product_links = driver.find_elements(By.CLASS_NAME, 'woocommerce-loop-product__link') for link in product_links: print(link.get_attribute('href')) driver.quit()
内容的提问来源于stack exchange,提问作者José Maria Vayas O
相关产品推荐
相关产品推荐

