情人节快到了,还不知道给女朋友买什么礼物?
直男:别问,问就是口红
在这里插入图片描述
好吧,那我们今天就来爬一下口红,看看什么色号最受欢迎!
在这里插入图片描述
很多兄弟都是苦于没有对应的资料,不清楚方向要学什么,或者有问题半天解决不了就很烦不想学了,这都是小问题,资料都给大家准备好了,有学习问题也可以在这里问,互相交流点我加群
Python环境、pycharm编辑器/永久激活/翻译插件
python零基础视频教程
Python界面开发实战教程
Python爬虫实战教程
Python数据分析实战教程
python游戏开发实战教程
Python 电子书100本
学习路线规划
统统免费领取
Python相关问题可解答
Python相关外包需求可发布
Python相关招聘需求可发布
等等等等

好吧都可以加群,然后我们开始今天的内容叭。

流程
1、动态数据抓包演示
2、json数据解析
3、requests模块的使用
4、保存csv

要用到的环境和模块

python 3.6
pycharm
requests >>> pip install requests
csv

爬虫基本思路

开始之前先给不会爬虫的兄弟大概了解一下爬虫的基本思路。

一. 数据来源分析
确定一下需求
1. 通过开发者工具进行抓包分析
前50个商品 为一组 url地址 有什么不一样
中50个商品 为一组
后20个商品 为一组
(切片)
只要获取到所有的商品ID 即可获取所有的商品信息
先获取商品ID 再把商品ID 分段传入请求 再获取商品数据 最后再保存

二. 代码实现过程

1. 发送请求 
2. 获取数据 
3. 解析数据(提取商品ID)
4. 把商品ID分段传入 发送请求
5. 解析数据(提取商品信息)
6. 保存数据
7. 多页爬取

requests要自己安装一下

import requests  # 发送请求 数据请求 pip install requests
import pprint  # 格式化输出模块
import csv  # 内置模块
import time

写入表头

f = open('口红数据.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '品牌', '原价', '折扣', '售价', '基本信息', '详情页'])
csv_writer.writeheader() 

发送请求 获取数据 解析数据

headers = {
    'referer': 'https://category.vip.com/',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.3',
}


def get_shop_info(pid):
    index_url = 'https://mapi.vip.com/vips-mobile/rest/shopping/pc/product/module/list/v2'
    params_1 = {
        'app_name': 'shop_pc',
        'app_version': '4.0',
        'warehouse': 'VIP_HZ',
        'fdc_area_id': '104103101',
        'client': 'pc',
        'mobile_platform': '1',
        'province_id': '104103',
        'api_key': '70f71280d5d547b2a7bb370a529aeea1',
        'user_id': '',
        'mars_cid': '1618053045038_6c9f5ed5dbad3934f24d94f695bd47c8',
        'wap_consumer': 'a',
        'productIds': pid,
        'scene': 'search',
        'standby_id': 'nature',
        'extParams': '{"stdSizeVids":"","preheatTipsVer":"3","couponVer":"v2","exclusivePrice":"1","iconSpec":"2x","ic2label":1}',
        'context': '',
        '_': '1627993112200',
    }
    response_1 = requests.get(url=index_url, params=params_1, headers=headers)
    json_data = response_1.json()['data']['products']
    for index in json_data:
        try:
            title = index['title']
            name = index['brandShowName']
            market_price = index['price']['marketPrice']
            sale = index['price']['saleDiscount']
            sale_price = index['price']['salePrice']
            shop_info = '|'.join([j['name'] + ':' + j['value'] for j in index['attrs']])
            # https://detail.vip.com/detail-1711236176-6918710001647165520.html
            href = 'https://detail.vip.com/detail-' + index['brandId'] + '-' + index['productId'] + '.html'
            # [色系: 豆沙色调]
            dit = {
                '标题': title,
                '品牌': name,
                '原价': market_price,
                '折扣': sale,
                '售价': sale_price,
                '基本信息': shop_info,
                '详情页': href,
            }
            csv_writer.writerow(dit)
            print(title, name, market_price, sale, sale_price, shop_info, href)
        except:
            pass

部分代码

for page in range(0, 1081, 120):
    time.sleep(1)
    # 发送请求网址  我们要去浏览的一个网址
    url = 'https://mapi.vip.com/vips-mobile/rest/shopping/pc/search/product/rank'
    params = {
        # 'callback': 'getMerchandiseIds',
        'app_name': 'shop_pc',
        'app_version': '4.0',
        'warehouse': 'VIP_HZ',
        'fdc_area_id': '104103101',
        'client': 'pc',
        'mobile_platform': '1',
        'province_id': '104103',
        'api_key': '70f71280d5d547b2a7bb370a529aeea1',
        'mars_cid': '1618053045038_6c9f5ed5dbad3934f24d94f695bd47c8',
        'wap_consumer': 'a',
        'standby_id': 'nature',
        'keyword': '口红',
        'sort': '0',
        'pageOffset': page,
        'channelId': '1',
        'gPlatform': 'PC',
        'batchSize': '120',
        '_': '1627993112197',
    }
    # 请求头作用是什么?  把python伪装成浏览器发送请求
    # referer: 防盗链 告诉服务器 我们请求的网址来自于哪里 跳转
    # user-agen: 浏览器的基本信息
    # 发送请求
    response = requests.get(url=url, params=params, headers=headers)
    # response.text 获取文本数据
    # response.json() 获取json字典数据
    # response.content 获取二进制数据
    # pprint.pprint(response.json())
    # 解析数据 json数据直接解析 通过键值对取值 通过冒号左边的内容 提取冒号右边的内容
    # 遍历提取 列表推导式
    products = response.json()['data']['products']
    pid_list = [i['pid'] for i in products]  # 列表推导式

    # pid_list = []
    # for i in products:
    #     pid = i['pid']
    #     pid_list.append(pid)
    # 切片 列表 把列表转成字符串数据
    # print(pid_1)
    # print(type(pid_1))
    # print(len(pid_1))
    # 前50个商品 为一组
    # 中50个商品 为一组
    # 后20个商品 为一组
    pid_1 = ','.join(pid_list[0:50])  # 0-49
    pid_2 = ','.join(pid_list[50:100])  # 50-99
    pid_3 = ','.join(pid_list[100:])  # 100 到最后所有的

    get_shop_info(pid_1)
    get_shop_info(pid_2)
    get_shop_info(pid_3)

好了,大家可以自己试试,有啥问题或者需要跟这个相关的视频教程点我获取


本文转载:CSDN博客