Python中如何抓取某猫列表页数据?菜鸡求助,快要自闭了

比如 https://list.tmall.com/search_product.htm?s=0&cat=50103156&amp&brand=94136&amp&q=%B7%A2%C4%A4&amp&sort=s&amp&style=g&amp&search_condition=23&amp&from=sn__brand-qp&amp&active=1&amp&industryCatId=50103156&amp&spm=a220m.1000858.1000721.1.6bdd6701AdE1fX 想问有没有不需要登陆 /账号信息抓取的方法, 找了几个接口, 都需要登陆, 即使带上登陆 cookie 不久也会被封, 关键现在不给账号密码, 只有 cookie, 模拟登陆也不能. 有没有大佬有比较好的办法或者接口.

觉得这是一个很无理的问题 -.- , 不过我要自闭了


Python中如何抓取某猫列表页数据?菜鸡求助,快要自闭了

25 回复

你模拟一下浏览器, 别直接 requests。


import requests
import json
from urllib.parse import urlencode
import time

class TmallCrawler:
    def __init__(self):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            'Referer': 'https://list.tmall.com/'
        }
        self.session = requests.Session()
        
    def get_list_data(self, keyword, page=1, pagesize=60):
        """获取商品列表数据"""
        base_url = "https://list.tmall.com/search_product.htm"
        
        # 构建查询参数
        params = {
            'q': keyword,
            'type': 'p',
            'spm': 'a220m.1000858.1000724',
            'style': 'g',
            'from': 'mallfp..pc_1_searchbutton',
            's': (page - 1) * pagesize  # 计算起始位置
        }
        
        url = f"{base_url}?{urlencode(params)}"
        
        try:
            response = self.session.get(url, headers=self.headers, timeout=10)
            response.raise_for_status()
            
            # 天猫列表页数据通常通过JavaScript加载
            # 这里需要解析页面中的JSON数据
            return self._parse_page_data(response.text)
            
        except requests.RequestException as e:
            print(f"请求失败: {e}")
            return None
    
    def _parse_page_data(self, html):
        """解析页面中的商品数据"""
        import re
        
        # 查找JSON数据(天猫通常将数据放在JS变量中)
        pattern = r'g_page_config\s*=\s*({.*?});'
        match = re.search(pattern, html, re.DOTALL)
        
        if match:
            try:
                data = json.loads(match.group(1))
                items = data.get('mods', {}).get('itemlist', {}).get('data', {}).get('auctions', [])
                
                product_list = []
                for item in items:
                    product = {
                        'title': item.get('title', ''),
                        'price': item.get('view_price', ''),
                        'sales': item.get('view_sales', ''),
                        'shop': item.get('nick', ''),
                        'item_id': item.get('nid', ''),
                        'detail_url': item.get('detail_url', '')
                    }
                    product_list.append(product)
                
                return product_list
                
            except json.JSONDecodeError:
                print("JSON解析失败")
                return []
        
        return []
    
    def crawl_pages(self, keyword, max_pages=5):
        """爬取多页数据"""
        all_products = []
        
        for page in range(1, max_pages + 1):
            print(f"正在爬取第 {page} 页...")
            
            products = self.get_list_data(keyword, page=page)
            if products:
                all_products.extend(products)
                print(f"第 {page} 页获取到 {len(products)} 个商品")
            
            # 添加延迟,避免请求过快
            time.sleep(2)
        
        return all_products

# 使用示例
if __name__ == "__main__":
    crawler = TmallCrawler()
    
    # 搜索关键词
    keyword = "手机"
    
    # 爬取前3页数据
    products = crawler.crawl_pages(keyword, max_pages=3)
    
    # 打印结果
    print(f"\n总共获取到 {len(products)} 个商品:")
    for i, product in enumerate(products[:5], 1):  # 只显示前5个
        print(f"{i}. {product['title'][:50]}... | 价格: {product['price']} | 销量: {product['sales']}")
    
    # 保存到JSON文件
    with open('tmall_products.json', 'w', encoding='utf-8') as f:
        json.dump(products, f, ensure_ascii=False, indent=2)
    print("\n数据已保存到 tmall_products.json")

核心要点:

  1. 请求头设置:必须包含User-Agent和Referer,否则会被拦截
  2. 参数构造:天猫搜索页通过URL参数控制分页,s参数是起始位置
  3. 数据解析:商品数据藏在g_page_config这个JS变量里,用正则提取JSON
  4. 反爬处理:添加time.sleep()避免请求过快被ban

需要注意:

  • 天猫有反爬机制,可能需要处理cookies或验证码
  • 数据是动态加载的,如果页面改版需要调整解析逻辑
  • 考虑使用代理IP应对频繁访问

一句话建议: 重点搞定页面数据解析,天猫的数据藏在JS变量里。

把 useragent 改成浏览器?反正就是伪装成浏览器

没代理池你还想爬天猫?

帮忙人工置顶。。
之前遇到过一个外包,考虑到阿里变态的反爬虫没做。
坐等大佬答疑解惑,有答案了 @我一下。。

算了呦
你猫的账号被封了怎么办。。。

哈哈 我有方案,已经成熟

正研究店铺所有物品

没点儿 ip 敢爬阿里系,佩服

小学生挑战哥德巴赫猜想系列

点进来之前以为是猫眼的我 233333

登陆账号也会各种验证你

是不是频率太快了?

ip 池.不然稍微多了点就被会扳

selenium 打开百度,用那个百度搜天猫,然后打开就不会直接要求你登录了。还是多换 IP,我也正在爬某猫

我很好奇,爬这个有啥用吗?

天猫的反爬虫挺变态的,貌似会自我学习,你研究出来一个办法,过一段时间后就失效了

爬阿里系可悠着点 毕竟自己还要用支付宝和淘宝

阿里的代码里很容易就找到$cdc_asdjflasutopfhvcZLmcfl_"in document||navigator.webdriver 这种检测自动化的代码
兄弟是自己改过变量名重新编的么

需求说明白点?。。这种页面如果牺牲效率的话,爬起来挺简单的。。

国内的需要手机号, 而且都比较变态啊 , 那点钱真不值得.

试试 chrome 的 Web Scraper 插件

给你个提示,尝试一下 H5 版本的搜索接口

然后就是阿里系的东西都需要有比较高质量的 IP 才能大量爬,账号不是必须的

selenium 用 firefox 就检测不到 webdriver,Chrome 就能检测到,找了一天也没找出为什么,头晕

回到顶部