Python爬虫如何爬取异步加载网站www.icgoo.net的数据?

null
Python爬虫如何爬取异步加载网站www.icgoo.net的数据?

12 回复

获取 csrftoken 然后抓就是了


要爬取像 www.icgoo.net 这种异步加载(AJAX)的网站,关键不是直接请求页面HTML,而是找到它背后真正提供数据的API接口。直接用 requests 抓首页,拿到的只是个空壳,数据都在后续的XHR请求里。

核心思路:

  1. 浏览器开发者工具是主力:打开F12,切到 Network 标签,刷新页面,重点筛选 XHRFetch 请求。
  2. 找到数据接口:在请求列表里找那些看起来像返回数据的请求(看 PreviewResponse),比如名字里带 api, data, list, search 的。
  3. 分析请求参数:看看这个请求的 Headers(特别是 Query String ParametersPayload),搞清楚它要哪些参数(比如页码 page、关键词 keyword 等)。
  4. 模拟请求:用 requests 库,带上必要的 headers(至少把 User-Agent 伪装成浏览器)和参数,直接请求这个接口URL。
  5. 解析数据:接口返回的通常是 JSON,直接用 .json() 方法解析成Python字典或列表,然后提取你要的字段。

举个代码例子(假设你找到了一个产品列表接口):

import requests
import pandas as pd

def fetch_icgoo_data(keyword, max_pages=5):
    # 1. 关键:找到的真实API URL(这里是我假设的,你需要自己找)
    url = "https://www.icgoo.net/api/product/search"
    
    # 2. 伪装成浏览器的请求头(基本操作)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
        "Accept": "application/json, text/plain, */*",
        # 如果接口需要,可能还要加 Referer, Authorization 等
    }
    
    all_products = []
    for page in range(1, max_pages + 1):
        # 3. 构造查询参数(具体参数名和结构要按你找到的来)
        params = {
            "keyword": keyword,
            "page": page,
            "size": 20,  # 每页条数
            "sort": "default"
        }
        
        try:
            resp = requests.get(url, headers=headers, params=params, timeout=10)
            resp.raise_for_status()  # 检查请求是否成功
            data = resp.json()
            
            # 4. 解析数据(这里假设返回结构是 { "data": { "list": [...] } })
            product_list = data.get("data", {}).get("list", [])
            if not product_list:
                break  # 没数据了就停止
                
            all_products.extend(product_list)
            print(f"第 {page} 页抓取成功,共 {len(product_list)} 条")
            
        except Exception as e:
            print(f"第 {page} 页请求失败: {e}")
            break
    
    # 5. 转成DataFrame方便处理
    df = pd.DataFrame(all_products)
    return df

# 使用示例
if __name__ == "__main__":
    # 搜索关键词为"电容"
    df_result = fetch_icgoo_data("电容", max_pages=3)
    print(f"总共抓取到 {len(df_result)} 条产品数据")
    # 保存到CSV
    df_result.to_csv("icgoo_products.csv", index=False, encoding='utf_8_sig')

几个要点:

  • 接口地址和参数是关键:上面的 urlparams 都是我猜的,你必须自己用开发者工具找到正确的。
  • 注意反爬:如果被拦,可能需要加更多 headers(比如 Referer),或者考虑用 requests.Session() 保持会话,甚至上 selenium 这种浏览器自动化工具来绕开复杂的JS验证(但那个就重了)。
  • 遵守 robots.txt:爬之前看一眼 https://www.icgoo.net/robots.txt,尊重网站的规则。
  • 控制频率:别把人家的服务器搞挂了,在循环里加个 time.sleep(1) 之类的。

总结:直接找数据接口比解析页面简单多了。

请问如何获取呢

最简单的方式是通过模拟浏览器的方式进行爬虫,缺点就是稍微有点慢,需要等到页面加载完成才好

用 phantomjs 模拟浏览器方式来试试

点进 chrome 里面的 Source,到?partno=ADIS16251ACCZ&qty=1 这个 page 里面搜索 token 字段,把 token 出现的地方打断点调试,边调试边读 js 代码的实现,token 初始值多少经过什么代码变成了什么样子,最后算出来是多少。然后使用 python 代码实现~

五楼的方法是对的,不过如果处理 token 的 js 比较恶心的话就很麻烦,想简单就用 PhantomJS

逆向自己实现加密 /抠 js 加密部分出来运行 /模拟浏览器

selenium + webdriver

requests-html 了解一下

https://blog.csdn.net/qq_39802740/article/details/88557981 我最近写了个爬虫~ 好像就是这个 icgoo 的 哈哈 不过是 366 天前的了

哈哈,366 天前我还在实习呢

回到顶部