爬取淘宝商品链接的图片和视频-第二部分

爬取单个商品链接的所有图片链接,视频链接,标题,店铺名

import time
from DrissionPage import ChromiumPage
import csv
from lxml import etree
import json

# 爬取单个链接详情数据【函数】
# 爬取 单个链接 详情数据
def sigle_link(url): # url:单个商品链接的详情网址
    # 实例化浏览器对象
    chrom=ChromiumPage()
    # 监听数据包  https://h5api.m.tmall.com/h5/mtop.taobao.pcdetail.data.get/1.0/  商品详情
    # 先监测数据包目的是因为第一次运行可能需求手动登录,配合chrom.listen.wait(), 若数据包一直没有出现,则会一直等待,直至数据包出现, 提高容错率
    data_bag = f"https://h5api.m.tmall.com/h5/mtop.taobao.pcdetail.data.get/1.0/"
    chrom.listen.start(data_bag)
    # 打开网页【商品链接详情页】
    chrom.get(url)
    print("如需求登录或验证,请手动登陆!!!")
    # 等待数据包加载
    # 在 DrissionPage 的监听功能中,默认情况下,chrom.listen.wait() 方法如果没有指定 timeout 参数,它会永久等待,直到捕获到目标数据包为止。
    resp = chrom.listen.wait() # 第一次运行时,可能需要你手动登录, 登录完成后才能获取数据
    print("成功跳转到:\n"+url)
    print("获取到数据包!!!开始尝试解析!!!")
    # 获取响应数据
    response_data = resp.response.body
    # print("处理前:")
    # print(response_data)
    # 检查response_data是否为字节类型。在网络请求中,从服务器获取的响应数据有时会以字节类型返回,而后续处理 JSON 数据需要字符串类型,所以需要进行检查和转换
    if isinstance(response_data, bytes):
        print("response_data是字节类型,使用decode('utf-8')方法将其解码为 UTF - 8 编码的字符串")
        response_data = response_data.decode('utf-8')
    try:
        # 处理JSONP格式,去掉外层包裹
        start_index = response_data.find('{') # 查找字符串response_data中第一个{的位置,这是 JSON 数据的起始位置
        end_index = response_data.rfind('}')  # 查找字符串response_data中最后一个}的位置,这是 JSON 数据的结束位置
        # 通过切片操作,提取出完整的 JSON 字符串部分。
        # 有些接口返回的数据可能是 JSONP 格式,即数据被包裹在一个函数调用中
        # 例如mtopjsonp5({"key": "value"}),这一步是去除包裹部分,只保留 JSON 数据本身
        json_str = response_data[start_index:end_index + 1]
        response_json_data = json.loads(json_str) # 使用json.loads()函数将提取的 JSON 字符串转换为 Python 字典
        # print("处理后:")
        # print(response_json_data)
    except json.JSONDecodeError as e:
        print(f"解析JSON数据时出错: {e}")

    # 解析数据
    # 初始化默认值,避免数据缺失时出现错误
    sigle_link_data = {
        '店铺': '未找到店铺信息',
        '商品标题': '未找到商品标题',
        '图片': [],
        '视频': []
    }
    sigle_link_data['商品链接'] = url

    # 获取 response_json_data 中的 data 部分
    data = response_json_data.get('data')
    if data:
        seller = data.get('seller')
        if seller == None: # 应对反爬的措施之一, 检查数据是否为空,若为空说明被反爬,需要人工介入检查!!!
            print("数据为空!!!")
            print("请检查是否需要真人验证!!!")
            print("人工检验中.....................................................")
            errno_information = input("若检验完成,请输入 1:\n")
            if errno_information == 1:
                print("检验完成!!!即将重新继续获取该链接的数据!!!")
                sigle_link_data = sigle_link(url)
                print("该链接的数据重新获取成功!!!")
                print("重新获取的商品链接详情数据如下:")
                print(sigle_link_data)
                print("即将把重新获取的数据返回,并写入csv文件!!!")
                return sigle_link_data  # 返回重新获取的该链接详情数据
        if seller:
            # 店铺信息
            store = seller.get('shopName')
            if store:
                sigle_link_data['店铺'] = store

        item = data.get('item')
        if item:
            # 商品标题信息
            shop_title = item.get('title')
            if shop_title:
                sigle_link_data['商品标题'] = shop_title

            # 图片信息
            images = item.get('images', [])
            for image in images:
                sigle_link_data['图片'].append(image)

            # 视频信息
            videos = item.get('videos', [])
            for video in videos:
                video_url = video.get('url')
                if video_url:
                    sigle_link_data['视频'].append(video_url)
    # print(sigle_link_data)
    return sigle_link_data # 返回单个链接的详情数据

# 写入csv文件【函数】
# 将单个链接的数据写入csv文件
def sigle_link_data_writer_to_csv(data,csv_writer): # data:单个链接的详情数据
    for image in data['图片']:
        csv_writer.writerow({
            '店铺': data['店铺'],
            '商品链接': data['商品链接'],
            '商品标题': data['商品标题'],
            '图片': image,
            '视频': ''
        })
    for video in data['视频']:
        csv_writer.writerow({
            '店铺': data['店铺'],
            '商品链接': data['商品链接'],
            '商品标题': data['商品标题'],
            '图片': '',
            '视频': video
        })

# 测试函数
def text():
    url='http://click.simba.taobao.com/cc_im?p=%CD%B6%D3%B0%BB%FA%B0%EC%B9%AB&s=2023495167&k=1977&e=qEscFPqUo0EvxTNePaNIcB%2Bz%2F76h5XVWPXAumbtCMNRHVq4WSGi0ueVvi7MBsIlbh%2Bdell%2F0T%2BxsRodrsPT3GymPaw%2BDI0qEuKKUVp9savhpypaynkwwSqB0l3veIaAt5sHHRcb%2Bnvg9lxyJB4%2BY0IriPa4U89UPqunYUDECSP%2FmjH66ahRMapkc4bzSQaQj%2FUM0fDfajXS5BLa03tHOtCWMebFOcBBTs%2BKuO1hLBTa3G00G6hFE7bY9pkW0LK6FZbCe7oO%2BqHIAEeOsF2r6MtmK5XbMpd1vipRSFaEfnx%2Ba5Hl86jaNZP8uEriplDD%2FLsodMldtYDG64UzfK7ToFqv4uz%2FxcRKssSlzRSxo%2BTQpfDhCAj5q7EatVB2TYUtC2J1rZaWwYJrfdfuC9KmLq8stKuf9fwFCBauuq13wPhmL5QhucoL0RxPI7L58B3AHzylQ86ezh7vB5NSG1ccVbj7997D%2FdJN50pz%2FnuknO1KO%2FZnqgCQM%2Ffnkd%2BXlNbyNAYC0bQ1vcVVb%2FEgs6vMYIdq3S9R0h1OOVUS5bwNQ0Nv7bzW0zjEYc1O9ikwWCTmcN4WhhrJuiUweYcCBLc0Za%2FsaRz8R0if5xGoEZjXGXpkLC040medQc8jYqGf8jjy%2FSErvSS84%2B%2BcFHcWh4EiHqM7fPmICj6Ku%2FfeIeJonGeFp1bGxubXHvTNgEY4wra7oQGhS4sbdCxWLekWoKtALLwZbKIwKbjSRrEPGtZyzTMek8f66LjUjWB%2BvL3SzVurz%2BwBkpZY08I6J8TpEGBd%2BeTGT%2Bplh9xPexZkrdHnw5K%2FnjZ0QmEq5ade1DJdMUQJc33O8uMto%2BbjOxh%2Bws1jX6zRK7O8nGkXvD0899U3gjUJM3TEcpysDDCm5WlrdSET7UUi5vlCwuq6DUZ%2F1%2FNxFrpWr2ZBGvvBQtlKs6t8nUzuN50mSHDj4hRAqRyv2PkaMRP6GvNzLdEE6XPO3R4ZOsbNqB6Am942aRPmnLqADbyvZ4%2BMcTgz5umI79c9tsiceukhKdHA%2B35OYrF%2Bmr8S5Re5WpYKWM3b82%2FpNLBGNgJKr0HpMQo3Ei5a8odK6%2FKrFvjj1i61K1Ptj%2FIpnYPLxitxaQ1WM2ye37ugizNo%2Bev5Xn%2FQYrOST5ZUtZ41vZ5bvagAcsRhvnmiUoyfUN0c3LNUpFdo%2Fie5oKHDxbkc1Nvb6AYSSIOJMNfpp3acBX90e%2Bko2k4%2FO77%2FbXPaOM4S43bdcFmOu6uODCsuskS7A5fMA1%2BfnOO6grDQGAeYL44sb8k5Fln6AqfVi%2BAjIApsfNUudFqYabaWX3HcwY07dBUADrEMeb72UsvkKQ5wqyxse14l9bJcUnBApHtEjGM8d7YYTVxXrtqmpQE2HHqrXAsqo8iiSxpt8tFJjLsMRzRhZbUvZxXpx%2FW%2BXzc%2FCqo4zwXSWTCCreV9IKxFOsQbnIIAnEYsPuXfBR4AsYhCWBBKpCaeCCXXQ4KUrEU6xBucggL3TDfJoCkYbRSg%2BjtMqrQvUqmu2QEHXnB1e%2FXU0Dfp8H%2FbAU1gH3K2V0kjtdFxp8TyMW5u4TI1R%2Ft48UM8nMAy71noeVyoWb7WosA6be0XxDG7t%2FI22Ju%2FVqMn7qaoUgaeWpcmIgc7aV3QS3Xm0hzMyw2IZwR%2F0fVMHYbjmmbf789sbM94E38SrE%2FGnNE%2BkWcMP8RV53PtJQdD6fFP8v3o5YBOW3BqWK25gzd7h%2Bv3a%2BOJxjFpcttGMLyMeFLbmUl%2FIhHHoVvoTTzyl7Ndiw47dsNAiIO%2FqEFs6IWYa2K5xeCPgaAhL10p04ZxlphrNcIm8gTfjtK7omDUBZpgMdVdLYQ8crIj%2BnvwUdJQ1%2B5cNzyDN0iAKWpqvCg2Sp41QWG6xL0d0MGPw%2F1WDI1FWRufng5LozlKvKlkrsPyo7M98Pv33sP90k3n%2B6OzuLnFLpSTAR22S6C7FlGYBzKU0kUJuv4hy1rBU3A%3D%3D'
    # 文件路径 【保存多个商品详情数据的csv文件】
    file = r".\data\自动化天猫商品链接详情数据.csv"
    # 创建文件对象,用于保存数据
    csv_file=open(file,mode='w',encoding='utf-8-sig',newline='')
    # 字典写入的方法
    csv_writer=csv.DictWriter(
        csv_file,
        fieldnames=['店铺','商品链接','商品标题','图片','视频']
    )
    # 写入表头
    csv_writer.writeheader()
    # 获取单个链接的数据
    sigle_link_data = sigle_link(url)
    print(sigle_link_data)
    # 写入单个链接的数据
    sigle_link_data_writer_to_csv(sigle_link_data,csv_writer)
    csv_file.close()

if __name__ == '__main__':
    text()

后续请关注查看剩余部分!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值