如何抓取TradeIndia页面全部317个企业链接并处理‘加载更多’
解决TradeIndia页面“加载更多”抓取全部企业链接的方案
嘿,我来帮你搞定这个问题~你用requests只能拿到前20个企业链接,核心原因是TradeIndia这个页面的「加载更多」是通过异步AJAX请求加载后续内容的,初始返回的静态HTML里只有前20条数据。下面给你两个最优解决方案,按需选择:
方案一:直接调用后台AJAX接口(高效推荐)
这种方式不用模拟浏览器,直接和网站后台接口交互,速度更快,资源占用更低。步骤如下:
- 找到AJAX接口:打开浏览器开发者工具(按F12),点击页面底部的「加载更多」,在「Network」标签下的「XHR」分类里,就能找到加载后续数据的POST请求(一般是类似
get_supplier_listing.php这类地址)。 - 复制请求参数:查看该请求的「Form Data」,里面包含分页、分类ID等关键参数,比如
page(页码)、cat_id(A3纸的分类ID)等。 - 编写循环请求代码:用requests库循环发送POST请求,直到接口返回空数据为止。
代码示例:
import requests from bs4 import BeautifulSoup import time # 基础配置 base_url = 'https://www.tradeindia.com/manufacturers/a3-paper.html' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Referer': base_url } # 初始化会话,保存Cookie session = requests.Session() initial_response = session.get(base_url, headers=headers) time.sleep(2) # 提取初始页面的20个链接 all_links = [] soup_initial = BeautifulSoup(initial_response.text, 'lxml') for div in soup_initial.find_all('div', class_='company-name'): link = div.find('a')['href'] all_links.append(link) # AJAX接口地址(从开发者工具获取) ajax_url = 'https://www.tradeindia.com/ajax/get_supplier_listing.php' # 请求参数(从开发者工具的Form Data复制,注意cat_id要对应A3纸的分类) request_params = { 'action': 'get_more_supplier', 'cat_id': '1989', 'page': 1, 'sortby': 'default', 'country': 'IN' } # 循环加载更多页面 while True: request_params['page'] += 1 try: ajax_response = session.post(ajax_url, data=request_params, headers=headers) ajax_response.raise_for_status() # 解析AJAX返回的HTML片段 soup_ajax = BeautifulSoup(ajax_response.text, 'lxml') company_divs = soup_ajax.find_all('div', class_='company-name') if not company_divs: print("没有更多企业数据了,停止抓取") break # 提取链接并去重 for div in company_divs: link = div.find('a')['href'] if link not in all_links: all_links.append(link) print(f"已抓取第{request_params['page']}页,累计获取{len(all_links)}个链接") time.sleep(3) # 加入延迟,避免被反爬封禁 except Exception as e: print(f"请求出错:{str(e)}") break # 输出所有链接 print("\n全部企业链接:") for link in all_links: print(link) print(f"\n总共抓取到{len(all_links)}个企业链接")
注意事项:
- 确认
cat_id参数的正确性:可以从初始页面的源码里搜索,或者直接看开发者工具里的请求参数。 - 保持headers的完整性:尤其是
User-Agent和Referer,避免被网站识别为爬虫。 - 不要去掉延迟:频繁请求容易触发网站的反爬机制,导致IP被封禁。
方案二:用Selenium模拟浏览器点击「加载更多」(直观易上手)
如果不想分析AJAX接口,也可以用Selenium模拟真实浏览器的操作,自动点击「加载更多」按钮,直到按钮消失。
代码示例:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup import time # 初始化浏览器(需要提前安装ChromeDriver或对应浏览器的驱动) driver = webdriver.Chrome() driver.get('https://www.tradeindia.com/manufacturers/a3-paper.html') time.sleep(3) all_links = [] while True: # 提取当前页面的所有企业链接 soup = BeautifulSoup(driver.page_source, 'lxml') for div in soup.find_all('div', class_='company-name'): link = div.find('a')['href'] if link not in all_links: all_links.append(link) try: # 等待「加载更多」按钮可点击并点击 load_more_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, 'load_more_supplier')) ) load_more_btn.click() time.sleep(3) except: # 没有更多按钮,停止循环 print("「加载更多」按钮已消失,停止抓取") break # 关闭浏览器 driver.quit() # 输出所有链接 print("\n全部企业链接:") for link in all_links: print(link) print(f"\n总共抓取到{len(all_links)}个企业链接")
注意事项:
- 需要安装Selenium库和对应浏览器的驱动(比如ChromeDriver要和Chrome版本匹配)。
- 如果网站有验证码或弹窗,可能需要额外处理。
- 模拟浏览器的速度比直接调用AJAX慢,但逻辑更直观,适合新手。
内容的提问来源于stack exchange,提问作者user12796700
相关产品推荐
相关产品推荐

