本次内容:

爬取电商平台数据,python爬取某维商品数据

课程亮点

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

环境介绍

  • python 3.8 [最好用和老师一样的版本]
  • pycharm 2021.2 专业版 yyds
  • requests >>> pip install requests
  • csv

安装方法:

win + R 输入cmd 输入安装命令 pip install 模块名

如果出现爆红 可能是因为 网络连接超时 切换国内镜像源

相对应的安装包/安装教程/激活码/使用教程/学习资料/工具插件 可以私我领取哦~

思路流程: (爬虫最基本流程)

一. 数据来源分析

分析我们想要的数据 可以从哪里获取

python 爬虫 1688商品数据 python爬取电商数据_python

  1. 通过开发者工具分析可得 一页商品 120条数据 他分为三组内容 50 50 20
  2. 每个url地址需要的商品ID 前50个ID为一组 中间50个ID为一组 最后20个ID为一组
  3. python 爬虫 1688商品数据 python爬取电商数据_python_02

  4. 去分析 我们商品ID从哪里来的…

如果想要通过爬取获取这些数据

  1. 首先获取所有商品ID
  2. 进行分组分类(切片) 前50 中50 后20
  3. 把这些传入 商品数据包里面 就可以得到 商品数据

二. 代码实现步骤

  1. 发送请求, 对于ID的网址发送你请求
  2. 获取数据, 获取服务器返回的数据内容
  3. 解析数据, 提取我们想要商品ID
  4. 发送请求, 把商品ID传入 商品数据包url里面
  5. 获取数据, 获取服务器返回的数据内容
  6. 解析数据, 提取我们想要商品数据信息
  7. 保存数据, 把数据保存csv表格文件
  8. 多页爬取
  9. 查看结果

爬虫 [模拟]浏览器对于服务器发送请求

首先导入模块

# 导入数据请求模块
import requests  # pip install requests 在cmd里面或者pycharm终端里面安装
# 导入格式化输出模块
import pprint
# 导入csv模块
import csv
# 导入时间模块
import time

后续代码

# 创建一个csv文件
f = open('口红data.csv', mode='a', encoding='utf-8', newline='')
# 调用csv方法
csv_writer = csv.DictWriter(f, fieldnames=[
    '标题',
    '品牌',
    '原价',
    '折扣',
    '售价',
    '属性',
    '详情页',
])
csv_writer.writeheader()


headers = {
    # 'cookie': 'vip_cps_cuid=CU1641815302342da2eee44221f3c0d4; vip_cps_cid=1641815302345_f63fc9087855c60e21a2950b0189ec24; cps_share=cps_share; vip_wh=VIP_NH; cps=adp%3Antq8exyc%3A%40_%401641815302344%3Amig_code%3A4f6b50bf15bfa39639d85f5f1e15b10f%3Aac014miuvl0000b5sq8cx6g534o9fx83; PAPVisitorId=8d9d410e1944339b815ec911aa7f9714; vip_new_old_user=1; vip_address=%257B%2522pname%2522%253A%2522%255Cu5e7f%255Cu4e1c%255Cu7701%2522%252C%2522pid%2522%253A%2522104104%2522%252C%2522cname%2522%253A%2522%255Cu5e7f%255Cu5dde%255Cu5e02%2522%252C%2522cid%2522%253A%2522104104101%2522%257D; vip_province=104104; vip_province_name=%E5%B9%BF%E4%B8%9C%E7%9C%81; vip_city_name=%E5%B9%BF%E5%B7%9E%E5%B8%82; vip_city_code=104104101; user_class=a; mst_area_code=104104; mars_sid=da8baa5d8a2c73dba298da602ff87292; mars_pid=0; visit_id=A7C92212D3DF003A212EB6666C36D2C3; VipUINFO=luc%3Aa%7Csuc%3Aa%7Cbct%3Ac_new%7Chct%3Ac_new%7Cbdts%3A0%7Cbcts%3A0%7Ckfts%3A0%7Cc10%3A0%7Crcabt%3A0%7Cp2%3A0%7Cp3%3A1%7Cp4%3A0%7Cp5%3A0%7Cul%3A3105; vip_access_times=%7B%22list%22%3A2%7D; pg_session_no=7; vip_tracker_source_from=; mars_cid=1641815303238_957cedc5b831e57207fd8334dcd97297',
    'referer': 'https://category.vip.com/',  # referer 防盗链 告诉服务器我们的请求的url地址 是从哪里跳转过来的
    # user-agent 用户代理 浏览器基本身份标识
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}


def get_shop_info(shop_id):
    """获取商品数据信息"""
    shop_url = 'https://mapi.vip.com/vips-mobile/rest/shopping/pc/product/module/list/v2'
    # 批量替换 选择要替换的内容 ctrl + R  输入 正则表达式命令
    data = {
        # 'callback': 'getMerchandiseDroplets1',
        'app_name': 'shop_pc',
        'app_version': '4.0',
        'warehouse': 'VIP_NH',
        'fdc_area_id': '104104101',
        'client': 'pc',
        'mobile_platform': '1',
        'province_id': '104104',
        'api_key': '70f71280d5d547b2a7bb370a529aeea1',
        'user_id': '',
        'mars_cid': '1641815303238_957cedc5b831e57207fd8334dcd97297',
        'wap_consumer': 'a',
        'productIds': shop_id,
        'scene': 'search',
        'standby_id': 'nature',
        'extParams': '{"stdSizeVids":"","preheatTipsVer":"3","couponVer":"v2","exclusivePrice":"1","iconSpec":"2x","ic2label":1}',
        'context': '',
        '_': '1641816680425',
    }
    response = requests.get(url=shop_url, params=data, headers=headers)
    # print(response.json())
    # pprint.pprint(response.json())
    products = response.json()['data']['products']
    for i in products:
        # pprint.pprint(i)
        # 创建一个字典 把数据内容传入字典
        shop_attrs_list = [j['name'] + ':' + j['value'] for j in i['attrs']]
        shop_attrs = ','.join(shop_attrs_list)
        href = f'https://www.vipglobal.hk/detail-{i["brandId"]}-{i["productId"]}.html'
        # ['色系:红调', '妆感:水润', ]
        dit = {
            '标题': i['title'],
            '品牌': i['brandShowName'],
            '原价': i['price']['marketPrice'],
            '折扣': i['price']['mixPriceLabel'],
            '售价': i['price']['salePrice'],
            '属性': shop_attrs,
            '详情页': href
        }
        # print(shop_attrs)
        csv_writer.writerow(dit)
        print(dit)


for page in range(0, 601, 120):
    time.sleep(1)
    # 1. 发送请求, 对于ID的网址发送你请求
    url = 'https://mapi.vip.com/vips-mobile/rest/shopping/pc/search/product/rank'  # 确定url地址
    # 请求参数
    data = {
        # 'callback': 'getMerchandiseIds',
        'app_name': 'shop_pc',
        'app_version': '4.0',
        'warehouse': 'VIP_NH',
        'fdc_area_id': '104104101',
        'client': 'pc',
        'mobile_platform': '1',
        'province_id': '104104',
        'api_key': '70f71280d5d547b2a7bb370a529aeea1',
        'user_id': '',
        'mars_cid': '1641815303238_957cedc5b831e57207fd8334dcd97297',
        'wap_consumer': 'a',
        'standby_id': 'nature',
        'keyword': '口红',
        'lv3CatIds': '',
        'lv2CatIds': '',
        'lv1CatIds': '',
        'brandStoreSns': '',
        'props': '',
        'priceMin': '',
        'priceMax': '',
        'vipService': '',
        'sort': '0',
        'pageOffset': page,
        'channelId': '1',
        'gPlatform': 'PC',
        'batchSize': '120',
        '_': '1641816680423',
    }
    # 请求头 把python代码伪装成浏览器发送请求(模拟成浏览器发送请求)
    # 发送请求
    response = requests.get(url=url, params=data, headers=headers)
    # 打印response数据 <Response [903]> 服务器给特定状态码 你请求失败了
    # <Response [200]> 200请求成功
    # 获取响应体什么数据response.json() 获取响应json字典数据
    # 字典取值 根据冒号左边的内容 提取冒号右边的内容
    # products = response.json()['data']['products']
    # lis = [] # 创建一个空列表
    # for index in products:
    #     pid = index['pid']
    #     lis.append(pid) # 往列表里面添加元素
    #     # print(pid)
    # print(lis)
    pid_list = [index['pid'] for index in response.json()['data']['products']]
    # print(pid_list)
    # 切片 分为三组 前50 中间 50 最后 20
    # [起始:结束:步长]  不写起始默认是0 不写步长默认 1  不写结束默认到最后
    # split 字符串分割方法 strip 去除字符串左右两端空格
    # 用 , 把列表里面所有元素合并起来
    string_1 = ','.join(pid_list[:50])
    string_2 = ','.join(pid_list[50:100])
    string_3 = ','.join(pid_list[100:])
    # 把列表转成字符串 join
    # string_4 = ','.join(pid_list)
    get_shop_info(string_1)
    get_shop_info(string_2)
    get_shop_info(string_3)

模块安装问题:

如果安装python第三方模块:

  1. win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车
  2. 在pycharm中点击Terminal(终端) 输入安装命令

安装失败原因:
失败一:

pip 不是内部命令
解决方法: 设置环境变量

失败二: 出现大量报红 (read time out)

解决方法: 因为是网络链接超时, 需要切换镜像源
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/
例如:pip3 install -i https://pypi.doubanio.com/simple/ 模块名

失败三: cmd里面显示已经安装过了, 或者安装成功了, 但是在pycharm里面还是无法导入

解决方法: 可能安装了多个python版本 (anaconda 或者 python 安装一个即可)
卸载一个就好或者你pycharm里面python解释器没有设置好


如何配置pycharm里面的python解释器?

  1. 选择file(文件) >>> setting(设置) >>> Project(项目) >>> python interpreter(python解释器)
  2. 点击齿轮, 选择add
  3. 添加python安装路径

pycharm如何安装插件?

  1. 选择file(文件) >>> setting(设置) >>> Plugins(插件)
  2. 点击 Marketplace 输入想要安装的插件名字 比如:翻译插件 输入 translation / 汉化插件 输入 Chinese
  3. 选择相应的插件点击 install(安装) 即可
  4. 安装成功之后 是会弹出 重启pycharm的选项 点击确定, 重启即可生效

好了,我的这篇文章写到这里就结束啦!

有更多建议或问题可以评论区或私信我哦!一起加油努力叭(ง •_•)ง

喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!