You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何抓取TradeIndia页面全部317个企业链接并处理‘加载更多’

解决TradeIndia页面“加载更多”抓取全部企业链接的方案

嘿,我来帮你搞定这个问题~你用requests只能拿到前20个企业链接,核心原因是TradeIndia这个页面的「加载更多」是通过异步AJAX请求加载后续内容的,初始返回的静态HTML里只有前20条数据。下面给你两个最优解决方案,按需选择:

方案一:直接调用后台AJAX接口(高效推荐)

这种方式不用模拟浏览器,直接和网站后台接口交互,速度更快,资源占用更低。步骤如下:

  1. 找到AJAX接口:打开浏览器开发者工具(按F12),点击页面底部的「加载更多」,在「Network」标签下的「XHR」分类里,就能找到加载后续数据的POST请求(一般是类似get_supplier_listing.php这类地址)。
  2. 复制请求参数:查看该请求的「Form Data」,里面包含分页、分类ID等关键参数,比如page(页码)、cat_id(A3纸的分类ID)等。
  3. 编写循环请求代码:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 07:52:56