用python采集四大电商平台商品数据进行对比

news2024/9/25 13:22:58

前言

大家早好、午好、晚好吖 ❤ ~


环境介绍:

  • python 3.8 越稳定越好

  • pycharm 2021专业版


一、考拉

模块使用:

  • requests >>> pip install requests

  • parsel >>> pip install parsel

代码展示

导入模块

# import 导入模块
import requests     # 第三方模块 额外安装 内置: 不需要你额外安装
import parsel       # 第三方模块 专门用来html标签数据
import csv          # 表格 内置模块
with open('考拉海购.csv', mode='a', encoding='utf-8', newline='') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow(['title', 'price', 'comments', 'address', 'selfflag', 'img_url', 'href'])
# 字典

1. 发送请求

    response = requests.get(url=url, headers=headers)

<Response [200]>: 请求成功

2. 获取数据

    html_data = response.text

3. 解析数据

html css javascript(JS) 前端网页制作三剑客

html(html源代码): 展示数据内容的

css: 页面变得更加美观的

js: 页面设计的有动态效果的

数据, 提取

.goodswrap.promotion

    select = parsel.Selector(html_data)
    goods = select.css('.goodswrap.promotion')
    for good in goods:
        # 详情页链接
        href = good.css('.title::attr(href)').get()
        # 图片链接
        img_url = good.css('.imgtag::attr(src)').get()
        # 价格
        price = good.css('.bigPrice::text').get()
        # 标题
        title = good.css('h2::text').get()
        title = title.replace('\n', '')
        # 评论数
        comments = good.css('.comments::text').get()
        # 地址
        address = good.css('.proPlace.ellipsis::text').get()
        # 商铺名称
        selfflag = good.css('.selfflag span::text').get()
        if selfflag == "" or selfflag == None:
            selfflag = good.css('.selfflag a::text').get()
        print(title, price, comments, address, selfflag, img_url, href)
        # 文件名称
        # 写入方式 追加写入
        # 编码
        with open('考拉海购.csv', mode='a', encoding='utf-8', newline='') as f:
            csv_writer = csv.writer(f)
            csv_writer.writerow([title, price, comments, address, selfflag, img_url, href])

PS:完整源码如有需要的小伙伴可以加下方的群去找管理员免费领取

二、苏宁

、

模块使用:

  • selenium >>> pip install selenium

    3.141.0 Python当中的模块 操作 浏览器的驱动

  • Chrome浏览器

  • Chromedriver

    浏览器驱动 操作浏览器 让 浏览器帮助我们去执行一些操作

思路:

日常如何打开浏览器查看商品的

代码就如何编写

  1. 用selenium打开一个谷歌浏览器

  2. 用谷歌浏览器 打开网站

  3. 提取商品信息 滚动

代码展示

导入模块

from selenium import webdriver      # 第三方模块 3.141.0   pip install selenium==3.141.0  pip uninstall selenium
import time
import csv

mode='a': 追加写入数据

encoding='utf-8': 编码方式 excel打开可能会出现中文乱码 换个软件打开 wps 或者换一个编码方式 gbk

newline='': 数据空行

f = open('suning.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.writer(f)

写入表头

csv_writer.writerow(['title', 'price', 'comment', 'store', 'detail_url'])

执行页面滚动的操作

def drop_down():
    for x in range(1, 12, 2):
        time.sleep(1)
        j = x / 9
        js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
        driver.execute_script(js)
def get_next():
    divs = driver.find_elements_by_css_selector('.product-box')

针对divs: 所有的商品信息, 进行二次提取

    for div in divs:
        # 针对每个商品==div
        # 价格 + 名称 + 评论
        # .text: 提取标签 文本内容
        # .get_attribute('href'): 提取标签的属性内容
        # <a class='' href='' sa-data=''>
        price = div.find_element_by_css_selector('.def-price').text
        title = div.find_element_by_css_selector('.title-selling-point').text
        comment = div.find_element_by_css_selector('.info-evaluate').text
        store = div.find_element_by_css_selector('.store-stock').text
        detail_url = div.find_element_by_css_selector('.title-selling-point a').get_attribute('href')
        print(title, price, comment, store, detail_url)
        csv_writer.writerow([title, price, comment, store, detail_url])

chromedriver.exe 放到 python.exe 同级目录下

谷歌浏览器(正版的) + 谷歌驱动(操作浏览器的一个程序 版本号)

1.用selenium打开一个谷歌浏览器

driver = webdriver.Chrome()
for page in range(0, 50):

2.用谷歌浏览器 打开网站

3.下拉页面

    drop_down()

4.提取数据 代码方式提取

    get_next()

PS:完整源码如有需要的小伙伴可以加下方的群去找管理员免费领取

三、淘

模块使用:

  • requests 模块

代码展示

导入模块

import requests     # 发送请求 第三方模块
import re
import json
import csv
with open('淘宝.csv', encoding='utf-8', mode='a', newline='') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow(['raw_title', 'view_price', 'item_loc', 'view_sales', 'comment_count', 'nick', 'detail_url'])

伪装

  1. 发送请求
    response = requests.get(url=url, headers=headers)
  1. 获取数据
    html_data = response.text
  1. 解析数据

g_page_config = ();

re.findall('g_page_config = (.*);', html_data): 匹配规则 匹配完数据之后 会把符合规则的所有内容全部返回 []

.*: 贪婪匹配模式 匹配到最后一个;结束

g_page_config = (.*?);

.*?: 非贪婪模式 匹配到第一;结束

    json_str = re.findall('g_page_config = (.*);', html_data)[0]
    json_dict = json.loads(json_str)

字典 键值对取值

    auctions = json_dict['mods']['itemlist']['data']['auctions']
    for auction in auctions:
        # auction代表每一个商品
        raw_title = auction['raw_title']
        view_price = auction['view_price']
        item_loc = auction['item_loc']
        try:
            view_sales = auction['view_sales']      # 销量
        except:
            view_sales = 0
        comment_count = auction['comment_count']
        nick = auction['nick']
        detail_url = auction['detail_url']
        print(raw_title, view_price, item_loc, view_sales, comment_count, nick, detail_url)
  1. 保存数据
        with open('淘宝.csv', encoding='utf-8', mode='a', newline='') as f:
            csv_writer = csv.writer(f)
            csv_writer.writerow([raw_title, view_price, item_loc, view_sales, comment_count, nick, detail_url])

四、唯

模块使用:

  • requests —> pip install requests

  • csv 内置模块 不需要安装

基本流程思路: <通用/固定流程模板>

一. 数据来源分析:

  1. 明确需求: 明确采集数据内容是什么

    • 采集口红商品数据
  2. 通过浏览器自带工具:

    开发者工具, 进行抓包分析 <无论采集那个网站什么数据, 都要抓包分析一下数据来源>

    • 打开开发者工具: F12 或者 鼠标右键点击检查选择 network <网络面板>

    • 刷新网页: 让本网页数据内容, 重新加载一遍

    • 通过搜索功能, 去查询找到, 商品所对应url地址<数据包>

    唯品会商品数据结构:

    整页商品一共是120条数据内容, 分成三组: 前50, 中50, 后20 —> 对应就有三个url地址

    分析这三个url地址, 请求参数变化 —> 改变商品ID —> 分析商品ID在什么地方可以一次性获得到

    想要获取商品数据信息 —> 请求三个链接, 把商品ID切片分成三组 —> 商品ID

二. 代码实现步骤:

I. 获取所有商品ID:

  1. 发送请求, 模拟浏览器对于 url地址<商品ID数据包> 发送请求

  2. 获取数据, 获取服务器返回响应数据内容

    开发者工具当中所看到 --> response

  3. 解析数据, 提取我们想要数据内容

    • 商品ID 120个全部获取下来

II. 获取所有商品数据信息

  1. 发送请求, 模拟浏览器对于 url地址<商品信息数据包> 发送请求

  2. 获取数据, 获取服务器返回响应数据内容

    开发者工具当中所看到 --> response

  3. 解析数据, 提取我们想要数据内容

    • 商品基本信息
  4. 保存数据, 把商品数据信息, 保存表格文件里面

代码展示

# 导入数据请求模块
import requests
# 导入格式化输出模块
from pprint import pprint
# 导入csv模块
import csv

f = open('口红_1.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '标题',
    '品牌',
    '售价',
    '原价',
    '折扣',
    '色系',
    '妆感',
    '类型',
    '是否套装',
    '商品属性',
    '详情页',
])
csv_writer.writeheader()


def Shop(shop_id):

    shop_data = {
        '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': '1655447722495_62c422a2b0d263186b2d64412108655f',
        'wap_consumer': 'a',
        'productIds': shop_id,
        'scene': 'search',
        'standby_id': 'nature',
        'extParams': '{"stdSizeVids":"","preheatTipsVer":"3","couponVer":"v2","exclusivePrice":"1","iconSpec":"2x","ic2label":1,"superHot":1,"bigBrand":"1"}',
        'context': '',
        '_': '1669032748487',
    }
    json_data = requests.get(url=link, params=shop_data, headers=headers).json()
    for index in json_data['data']['products']:

            attrs = ','.join([attr['name'] + ':' + attr['value'] for attr in index['attrs']])
            # 色系:红调,妆感:哑光,类型:唇釉,是否套装:是
            colour = index['attrs'][0]['value']  # 色系
            feel = index['attrs'][1]['value']  # 妆感
            kid = index['attrs'][2]['value']  # 类型
            Tao = index['attrs'][-1]['value']  # 是否套装
            dit = {
                '标题': index['title'],
                '品牌': index['brandShowName'],
                '售价': index['price']['salePrice'],
                '原价': index['price']['marketPrice'],
                '折扣': index['price']['mixPriceLabel'],
                '色系': colour,
                '妆感': feel,
                '类型': kid,
                '是否套装': Tao,
                '商品属性': attrs,
                '详情页': shop_url,
            }
            print(dit)
            csv_writer.writerow(dit)
        except:
            pass
for page in range(0, 1200, 120):

    data = {
        # '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',
        'user_id': '',
        'mars_cid': '1655447722495_62c422a2b0d263186b2d64412108655f',
        'wap_consumer': 'a',
        'standby_id': 'nature',
        'keyword': '口红',
        'lv3CatIds': '',
        'lv2CatIds': '',
        'lv1CatIds': '',
        'brandStoreSns': '',
        'props': '',
        'priceMin': '',
        'priceMax': '',
        'vipService': '',
        'sort': '0',
        'pageOffset': '0',
        'channelId': '1',
        'gPlatform': 'PC',
        'batchSize': '120',
        '_': '1669032748485',
    }

    response = requests.get(url=url, params=data, headers=headers)
    products = [i['pid'] for i in response.json()['data']['products']]
    product_id_1 = ','.join(products[:50])  # 0-49 顾头不顾尾  把列表合并为字符串  str.join(list)
    product_id_2 = ','.join(products[50:100])  # 50-99 顾头不顾尾
    product_id_3 = ','.join(products[100:])  # 100-最后 顾头不顾尾
    Shop(shop_id=product_id_1)
    Shop(shop_id=product_id_2)
    Shop(shop_id=product_id_3)

数据对比这个你们就自己去弄吧,博主累了~

尾语 💝

好了,今天的分享就差不多到这里了!

完整代码、视频讲解、疑惑解答直接点击下方名片自取即可。

宁外给大家推荐一个好的教程:

【48小时搞定全套教程!你和大佬只有一步之遥【python教程】

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这届黑客不讲武德

编者按 腾讯安全2022年典型攻击事件复盘第七期&#xff0c;希望帮助企业深入了解攻击手法和应对措施&#xff0c;完善自身安全防御体系。 本篇讲述了某物流公司遭遇不明黑客攻击&#xff0c;腾讯安全服务团队和客户通力合作&#xff0c;排查溯源&#xff0c;最后揪出黑客的尾…

十、HashMap详解

文章目录小结底层源码框架特点源码详解小结 Map接口的常用实现类:HashMap、Hashtable和Properties.HashMap是Map接口使用频率最高的实现类。HashMap是以 key-val对的方式来存储数据(HashMap$Node类型)key不能重复&#xff0c;但是值可以重复,允许使用null键和null值。如果添加…

Android设计模式详解之组合模式

前言 组合模式也称为部分整体模式&#xff0c;结构型设计模式之一&#xff1b; 定义&#xff1a;将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;使得用户对单个对象和组合对象的使用具有一致性&#xff1b; 使用场景&#xff1a; 表示对象的部分-整体的层…

屏幕录制为什么没声音?检查这2项,轻松解决

相信很多人在录制视频的时候都会遇到各种各样的问题&#xff0c;比如录制的视频没有声音。屏幕录制为什么没声音&#xff1f;今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音&#xff0c;你可以试试这个方法。 一、检查是否打开电脑系…

amCharts 5: Maps 附加组件

amCharts 5: Maps 附加组件 将reverseGeodata设置添加到MapPolygonSeries。如果设置为true&#xff0c;将反转GeoJSON数据中多边形角的方向。 向MapLine添加了新的linechanged事件。 amCharts 5&#xff1a;地图 amCharts:Maps是amCharts:Charts的附加组件。使用它可以将完整的…

Java学习笔记【7】面向对象

⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ &#x1f300; 个人首页&#xff1a;&#x1f3e0; 星空之路Star &#x1f3e0; &#x1f300; 所属专栏&#xff1a;&#x1f4d6; Java知识点总结 &#x1f4d6; &#x1f300; 大家好&#x1f91d; 我是 &#x1f449;老孙&#x1f448; &…

操作系统期末考试必会题库5——文件管理

1、画出文件系统的层次模型&#xff0c;并描述各层的功能。 2、某文件系统为一级目录&#xff0c;文件的数据一次性写入磁盘&#xff0c;已经写入的文件不可修改&#xff0c;但可以多次创建新文件&#xff0c;请回答&#xff1a; (1) 采用哪种文件物理结构形式更适合&#xff…

hnu计网实验二-网络基础编程实验(JAVA\Python3)

前言&#xff1a;这次实验用的是python语言&#xff0c;但是本人的python也不是很强&#xff0c;所以代码大部分也是借鉴别人的。实验本身还是很有趣的 一、实验目的 通过本实验&#xff0c;学习采用Socket&#xff08;套接字&#xff09;设计简单的网络数据收发程序&#xf…

Qt编写雷达模拟仿真工具

一、前言 雷达模拟仿真工具&#xff0c;已发布很长一段时间&#xff0c;一直以来没有好好整理该系列文章&#xff0c;在刘哥6.5的极力推荐下&#xff0c;整理出该系列的更加详细细节的文章出来。懒散了很久&#xff0c;也颓废了不少&#xff0c;人啊&#xff0c;感觉不能颓废下…

Python入门小案例: 采集全网表情包图片

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 环境使用: Python 3.8 Pycharm 2021.2版本 模块使用: import requests >>> pip install requests -pip install -i https://pypi.doubanio.com/simple/ requests import re 安装pyt…

Revit中:该扶手的坡度可能与梯段及平台楼梯不平行问题

一、Revit中单独绘制楼梯扶手问题 单独绘制扶手的时候总是会出现梯段及平台上的楼梯不平行&#xff0c;这种情况怎么办? 在正常操作下楼梯会制动生成扶手&#xff0c;但有时候还是回碰到单独绘制扶手的时候然后就会出现这样的些问题&#xff0c;如图1、图2所示。 解决方法&…

(Research)深度迁移学习使循环肿瘤细胞的病变追踪成为可能

Tips: 深度迁移学习使循环肿瘤细胞的病变追踪成为可能 &#xff08;Nat Commun&#xff09;&#xff0c;原文链接: https://pubmed.ncbi.nlm.nih.gov/36509761/ 摘要&#xff1a; CTC做为液体活检中最重要的一个目标&#xff0c;如果能够对 CTC 进行溯源那么就能够实现肿瘤的早…

mediasoup create/connect WebRtcTransport 流程分析

一. 前言 在这篇博客中我们介绍了 mediasoup-demo 启动流程与信令交互&#xff0c;关键信令包括 getRouterRtpCapabilites&#xff0c;join, createWebRtcTransport, connectWebRtcTransport, produce&#xff0c;本文将介绍 createWebRtcTransport 和 connectRtcTransport 的流…

为远程MySQL数据库配置固定的公网TCP地址【内网穿透】

在上篇文章中&#xff0c; 我们成功实现了在公网环境下远程连接内网MySQL数据库。但由于使用的免费的cpolar内网穿透&#xff0c;其所生成的公网地址为随机临时地址&#xff0c;24小时内会发生变化&#xff0c;对于需要长期远程访问的用户来讲非常不方便。因此&#xff0c;本篇…

华为云CDN加速服务,让企业用户上网“走高速”

如今CDN技术在互联网项目中越来越被广泛应用&#xff0c;虽然大多数人对于CDN并不熟悉&#xff0c;但其实我们的日常生活中的看新闻、看直播、网上购物等&#xff0c;都在无形之中跟CDN息息相关。 华为云CDN是通过部署广泛的节点服务器&#xff0c;将源站内容分发给靠近用户的智…

【修改】对“C语言实现轰炸代码”进行修改和完善

场景&#xff1a; 使用C语言实现“轰炸”效果&#xff0c;就是多条重复表情或信息的发送&#xff1b;使用场景是在QQ上面。 问题描述 1.不兼容&#xff0c;对于VS2022或者其他VS编译器无法实现效果。 2.代码能正常运行但无法弹出窗口进行发信息。 原因分析&#xff1a; 1.不…

力扣 2032. 至少在两个数组中出现的值

题目 给你三个整数数组 nums1、nums2 和 nums3 &#xff0c;请你构造并返回一个 元素各不相同的 数组&#xff0c;且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。 示例 输入&#xff1a;nums1 [1,1,3,2], nums2 [2,3], nums3 [3] 输出&a…

Day843.CompletableFuture -Java 并发编程实战

CompletableFuture Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于CompletableFuture的内容。 前面不止一次提到&#xff0c;用多线程优化性能&#xff0c;其实不过就是将串行操作变成并行操作。 如果仔细观察&#xff0c;还会发现在串行转换成并行的过程中&#…

堆树和堆排序

一、堆树 1、定义 堆树的定义如下&#xff1a; &#xff08;1&#xff09;堆树是一颗完全二叉树。 &#xff08;2&#xff09;堆树的每一个结点值都大于等于或者小于等于其左右子结点的值。 &#xff08;3&#xff09;堆树中每个结点的子树都是堆树。为什么是大于等于或者小于…

一口气讲透Redis分布式缓存、秒杀 + 思维导图

一、分布式缓存 1、单点Redis的问题 1、数据丢失问题 Redis数据持久化。 2、并发能力问题 大家主从集群&#xff0c;实现读写分离。 3、故障恢复问题 利用Redis哨兵&#xff0c;实现健康检测和自动恢复。 4、存储能力问题 搭建分片集群&#xff0c;利用插槽机制实现动…