【python】爬虫实战流程

2023-10-27

一、采集步骤

(1)网页解析

(2)引入第三方模块

import requests  #请求数据
import json #数据解析
from jsonpath import jsonpath #数据解析
import pandas as pd # 数据处理
import random # 随机函数
import time #间隔时间

(2)request请求

    def __init__(self,sku):

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

    def get_data(self):
        response = requests.get(self.url,headers = self.headers)
        response = response.content.decode()
        
        return response

(3)数据解析

def parse_data(self,data):

        # 因为还采集了一些其他相关信息,有的数据格式不一样,所以下面使用了两种json语法解析数据
        def try_1(data,path):      
            try:
                re = jsonpath(data,path)[0]
            except:
                re = '无'

            return re
        
        def try_2(data,path,value):      
            try:
                re_list = jsonpath(data,path)[0]
                for re in re_list:
                    info = re[value]
                return info
                
            except:
                info = '无'
                return info
                

        data = '{'+ data.split('({')[1].split('})')[0] + '}'
        json_data = json.loads(data)

        data_price_p = try_1(json_data,'$.price.p')
        data_gift_value = try_2(json_data,'$.promotion.gift','value')
        
        data_dict ={,'页面':data_price_p
                   ,'赠品名':data_gift_value
                   ,'时间':time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
                   }
        
        df = pd.DataFrame(data_dict,index=[0])    
    
        return df

(4)数据输入&保存

这一步主要就是实现批量输入和输出

    sku_list = pd.read_excel(r'data/输入文件.xlsx',header=None).iloc[:,0].to_list()
    print('需采集共{}个\n'.format(len(sku_list)))
    df_list = []
    for sku in sku_list: 
        try:
            price = Price(sku)
            df = price.run()
            df_list.append(df)
            time.sleep(random.random()*3)
            if (sku_list.index(sku)+1)%10 == 0:
                print('已采集{}条\n'.format(sku_list.index(sku)+1))

        except:
            print('共采集{}条,剩余未采集成功\n'.format(sku_list.index(sku)))
            break
    df_tmp = df_list[0]
    for i in range(1,len(df_list)):
        df_tmp = pd.concat([df_tmp,df_list[i]],join='outer')
    print('全部采集完成\n')
    df_tmp.to_excel(r'data/输出文件.xlsx', index=False)

二、遇到的问题

问题1:response部分数据为空值

问题描述:浏览器页面是有显示满减优惠券的,且在抓包数据里也是存在的,但实际采集的时候返回的是空值
问题原因:经过多次测试之后后来发现是登录问题,因为是针对新用户的优惠券,而我在采集的时候并没有设置cookie,所以采集不到数据,设置之后应该是可以采集成功的(后续实践后更新)

三、源代码

以下是源代码

import requests
import random
import time
import json
from jsonpath import jsonpath
import pandas as pd

class Price(object):
    
    def __init__(self,sku):

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

    
    def get_data(self):
        response = requests.get(self.url,headers = self.headers)
        response = response.content.decode()

        return response
    
    def parse_data(self,data):
        
        def try_1(data,path):      
            try:
                re = jsonpath(data,path)[0]
            except:
                re = '无'

            return re
        
        def try_2(data,path,value):      
            try:
                re_list = jsonpath(data,path)[0]
                for re in re_list:
                    info = re[value]
                return info
                
            except:
                info = '无'
                return info
                

        data = '{'+ data.split('({')[1].split('})')[0] + '}'
        json_data = json.loads(data)

        data_ad = try_1(json_data,'$.adText')
        data_coupon_ad = try_2(json_data,'$.couponInfo','addDays')
        data_coupon_btime = try_2(json_data,'$.couponInfo','beginTime')
        data_coupon_discount = try_2(json_data,'$.couponInfo','discountText')
        data_coupon_etime = try_2(json_data,'$.couponInfo','endTime')
        data_coupon_id = try_2(json_data,'$.couponInfo','couponId')
        data_coupon_label = try_2(json_data,'$.couponInfo','labelTxt')
        data_coupon_name = try_2(json_data,'$.couponInfo','name')
        data_ms = try_1(json_data,'$.miaoshaInfo.miaosha')
        data_ms_title = try_1(json_data,'$.miaoshaInfo.title')
        data_ms_stime = try_1(json_data,'$.miaoshaInfo.startTime')
        data_ms_etime = try_1(json_data,'$.miaoshaInfo.endTime')
        data_ms_op = try_1(json_data,'$.miaoshaInfo.originPrice')
        data_ms_p = try_1(json_data,'$.miaoshaInfo.promo')
        data_price_id = try_1(json_data,'$.price.id')
        data_price_m = try_1(json_data,'$.price.m')
        data_price_op = try_1(json_data,'$.price.op')
        data_price_p = try_1(json_data,'$.price.p')
        data_promotion = try_2(json_data,'$.promotion.activity','value')
        data_gift_id = try_2(json_data,'$.promotion.gift','proId')
        data_gift_value = try_2(json_data,'$.promotion.gift','value')
        data_rank = try_1(json_data,'$.rankUnited.revertItem.name')
        

        
        df = pd.DataFrame(data_dict,index=[0])    
    
        return df
        
        
    def run(self):
        re = self.get_data()
        data = self.parse_data(re)
        
        return data
        
        
        
if __name__ == "__main__":
    sku_list = pd.read_excel(r'data/输入文件.xlsx',header=None).iloc[:,0].to_list()
    print('需采集共{}个\n'.format(len(sku_list)))
    df_list = []
    for sku in sku_list: 
        try:
            price = Price(sku)
            df = price.run()
            df_list.append(df)
            time.sleep(random.random()*3)
            if (sku_list.index(sku)+1)%10 == 0:
                print('已采集{}条\n'.format(sku_list.index(sku)+1))

        except:
            print('共采集{}条,剩余未采集成功\n'.format(sku_list.index(sku)))
            break
    df_tmp = df_list[0]
    for i in range(1,len(df_list)):
        df_tmp = pd.concat([df_tmp,df_list[i]],join='outer')
    print('全部采集完成\n')
    df_tmp.to_excel(r'data/输出文件.xlsx', index=False)

声明:本博客均用于个人学习&分享,有错误欢迎指正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【python】爬虫实战流程 的相关文章

随机推荐

  • vs2019+QT新建UI窗口

    在vs2019中新建一个QT的widget窗口 第一步 第二步 其中可以选择MainWindow或者Widget窗口 填写好ui的名字 第三步 建立好对应ui名字的 h 和 cpp文件即可 双击新建的ui文件 如果打不开的话 可以重新配置一
  • 解决nes_py在pip安装报错的问题

    目录 项目场景 问题描述 原因分析 解决方案 解决结果 项目场景 想跟随油管某视频复现强化学习方法玩超级马里奥的过程 结果在在Anaconda3虚拟环境中用pip安装nes py时一直报错 报错信息如下 Building wheel for
  • 浏览器与Node的事件循环(Event Loop)有何区别?

    前言 本文我们将会介绍 JS 实现异步的原理 并且了解了在浏览器和 Node 中 Event Loop 其实是不相同的 一 线程与进程 1 概念 我们经常说JS 是单线程执行的 指的是一个进程里只有一个主线程 那到底什么是线程 什么是进程
  • PAT乙级1043 输出PATest (20 分)

    1043 输出PATest 20 分 一 问题描述 给定一个长度不超过 10 4 的 仅由英文字母构成的字符串 请将字符重新调整顺序 按 PATestPATest 这样的顺序输出 并忽略其它字符 当然 六种字符的个数不一定是一样多的 若某种
  • 初识微服务技术栈

    目录 什么是微服务 注册中心 配置中心 服务网关 分布式缓存和数据库 分布式搜素 消息队列 分布式日志服务 系统的监控链路追踪 持续集成 1 认识微服务 1 0 学习目标 1 1 单体架构 1 2 分布式架构 1 3 微服务 1 4 微服务
  • 由于找不到packet.dll,无法继续执行代码的多种解决方法分享

    在计算机领域中 packet dll是一个重要的动态链接库文件 它被用来进行网络数据包的捕获和分析 然而 有时我们可能会遇到packet dll缺失的问题 这将导致我们无法正常执行代码 下面我们将为你详细介绍如何解决这个问题 以确保你的代码
  • JS的执行上下文,变量声明提升,函数声明提升

    目录 一 什么是执行上下文 execution content 二 执行上下文的类型 三 执行上下文的生命周期 以函数执行上下文为例 四 变量声明提升 五 函数声明提升 一 什么是执行上下文 execution content 一句话 执行
  • java子类构造器第一行没有写super()为什么还会调用父类?

    子类构造器第一行会默认隐藏了super 隐式语句 如果第一行是this 的话 隐式super 会消失 备注 第一行只能允许this或者super 不可同时都写入
  • Nginx配置WebSocket(WS)和WebSocket Secure(WSS)的完整指南

    点点关注 点点关注 点点关注 Nginx是一款广泛使用的高性能Web服务器和反向代理服务器 除了传统的HTTP和HTTPS协议支持外 Nginx还可以配置WebSocket WS 和WebSocket Secure WSS 以便实现实时双向
  • android override报错,android @override 报错解决方案

    android override 报错解决方案 现象 java 1801 method does not override a method from its superclass Override 原因 Eclipse is defaul
  • 利用pytorch 实现深度残差网络(deep_residual_neural_network)

    利用pytorch 实现深度残差网络 深度残差网络 代码实现 输出结果 深度残差网络 残差网络是由来自Microsoft Research的4位学者提出的卷积神经网络 在2015年的ImageNet大规模视觉识别竞赛 ImageNet La
  • Spring Autowire自动装配

    在应用中 我们常常使用
  • C语言基础-选择语句之成绩判断

    文章目录 前言 一 C语言是什么 二 基础选择语句 1 if else 2 数据解读 3 switch case 总结 前言 只是基础 取悦自己 一 C语言是什么 官方解释 c语言是一门面向过程 抽象化的通用程序设计语言 广泛应用于底层开发
  • Vue使用echarts(完整版,解决各种报错)

    前言 Echarts 它是一个与框架无关的 JS 图表库 但是它基于Js 这样很多框架都能使用它 例如Vue 估计IONIC也能用 下次研究 因为我的习惯 每次新尝试做一个功能的时候 总要新创建个小项目 做做Demo 首先看自己电脑是否安装
  • k8s yml 样例

    文章目录 db deploy yml db service yml app deploy yml app service yml db deploy yml apiVersion apps v1beta1 kind Deployment m
  • linux报错 /bin/bash^M:解释器错误:没有那个文件或目录

    在Linux中运行脚本时 会出现linux报错 bin bash M 解释器错误 没有那个文件或目录 这是因为我们将在Windows下编写的脚本拷贝到Linux环境中运行时会出现运行不了的情况 主要还是Windows的换行符为 r n 而L
  • 2023电赛思路 E题:运动目标控制与自动追踪系统

    1 E题 运动目标控制与自动追踪系统 基本思路 1 1 实现步骤 设计红色光斑位置控制系统 选择合适的红色激光笔 并将其固定在一个二维电控云台上 使用电机和编码器来控制电控云台的水平和垂直运动 设计一个控制电路 可以通过输入控制信号来控制电
  • unity3d学习笔记-动画(3.导入动画)

    一 配置动画类型 在准备要导入 Unity 的动画时 动画师可以为每个单独的动画创建不同的文件 或者在一个文件中为所有内容制作动画 将包含多个动画的单个文件导入 Unity 时 可以在 剪辑 部分的导入设置中对其进行拆分 在这里 您可以定义
  • uniapp如何应用onNeedPrivacyAuthorization实现微信小程序隐私政策

    前言 微信小程序要求9 15日前实现隐私政策弹窗 但是uniapp文档一直没有更新 尝试直接使用wx onNeedPrivacyAuthorization 是可以生效的 步骤 在 微信小程序后台 的 设置 服务内容与声明 设置好小程序所需要
  • 【python】爬虫实战流程

    一 采集步骤 1 网页解析 2 引入第三方模块 import requests 请求数据 import json 数据解析 from jsonpath import jsonpath 数据解析 import pandas as pd 数据处