小程序端的懂车帝二手车数据采集

2024-05-05 23:04

本文主要是介绍小程序端的懂车帝二手车数据采集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

import datetime
import random
import string
import time
import pymysql
import requests
import json


def mysql_sql(conn, cur):
    """创建一个存储数据表和一个存储链接表"""
    cur.execute('''
       CREATE TABLE if not exists dcd_xcx_car (
        sku_id VARCHAR(200) primary key COMMENT 'id', 
        car_img_url VARCHAR(2000) COMMENT '车辆照片链接', 
        car_name VARCHAR(200) COMMENT '汽车发动机名称', 
        series_name VARCHAR(200) COMMENT '汽车名称', 
        brand_name VARCHAR(200) comment '品牌名称', 
        mileage VARCHAR(200) comment '里程数',
        first_registration_time VARCHAR(200) comment '汽车第一次注时间',  
        car_age VARCHAR(200) comment '汽车年龄',  
        sh_price VARCHAR(200) comment '价格', 
        title VARCHAR(200) comment '标题',
        sub_title VARCHAR(200) comment '副标题',
        link_url VARCHAR(2000) comment '详情链接',  
        car_year VARCHAR(200) comment '汽车生产年份',  
        car_source_city_name VARCHAR(200) comment '车源城市名称', 
        fixed_price VARCHAR(200) comment '固定价格', 
        origin_sh_price VARCHAR(200) comment '原产地价格'
    ) COMMENT='微信小程序端表数据';
    ''')
    cur.execute('''
       CREATE TABLE if not exists xcx_dcd_url (
        url VARCHAR(2000) COMMENT '链接信息'
    ) COMMENT='异常存储微信小程序端链接';
    ''')

    # 提交事务
    conn.commit()


def generate_random_string(length):
    """生成随机字符串用于id"""
    letters = string.ascii_letters
    result_str = ''.join(random.choice(letters) for i in range(length))
    return result_str


def start_load(requests, city, pagenum, visited_urls, conn, cur):
    """主函数"""
    cookies = {
        'tt_webid': '7365037271119562292',
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) XWEB/8555',
        'xweb_xhr': '1',
        'sec-fetch-site': 'cross-site',
        'sec-fetch-mode': 'cors',
        'sec-fetch-dest': 'empty',
        'referer': 'https://servicewechat.com/wx0688e7bcdd17106e/308/page-frame.html',
        'accept-language': 'zh-CN,zh;q=0.9',
    }
    url = f'https://m.dcdapp.com/motor/sh_go/api/shop/sku_search?aid=1556&device_id=7365037271119562292&master_aid&user_unique_id=7365037271119562292&os_version=Windows 10 x64&ma_version=5.10.429&app_name=wechat&data_from=tt_mp&device_platform=windows&device_type=microsoft&device_brand=microsoft&sdk_verison=3.2.4&api_version=2&version_code=0&city_name={city}&limit=10&offset={pagenum}&sort=4&shop_type=9&entry=main_page&sh_city_name={city}&selected_city_name={city}'
    cur.execute("INSERT INTO xcx_dcd_url (url) VALUES (%s)", (url))
    conn.commit()
    if url not in visited_urls:  # 检查URL是否已经被爬取过
        try:
            response = requests.get(
                url=url,
                cookies=cookies,
                headers=headers,
            )
        except Exception as e:
            print(e)
        time_date = random.uniform(3, 5)
        time.sleep(time_date)
        df = json.loads(response.text)
        sc = df['data']['sku_list']
        has_more = df['data']['has_more']
        if has_more == False:
            print("结束咯,往下面也没有数据啦")
            flag = 0
            return flag
        else:
            print(f"第{pagenum/10}页",url)
            for i in sc:
                rom_str = generate_random_string(5)
                sku_id = rom_str + str(i['sku_id'])
                car_img_url = i['car_img_url']
                car_name = i['car_name']  # 发动机名称
                series_name = i['series_name']  # 系列名称
                brand_name = i['brand_name']  # 品牌名称
                mileage = i['mileage']  # 里程数
                first_registration_time = i['first_registration_time']  # 第一次注时间
                first_registration_time = datetime.datetime.fromtimestamp(first_registration_time)
                car_age = i['car_age']  # 汽车年龄
                sh_price = i['sh_price'] + '万'  # 价格
                title = i['title']
                sub_title = i['sub_title']
                link_url = i['link_url']  # 详情
                car_year = i['car_year']  # 汽车年龄
                car_source_city_name = i['car_source_city_name']  # 车源城市名称
                fixed_price = i['fixed_price']  # 固定价格
                origin_sh_price = i['origin_sh_price'] + '万'  # 原产地价格
                # print(sku_id, car_img_url, car_name, series_name, brand_name, mileage, dt_object,
                #       car_age, sh_price, title, sub_title, link_url, car_year, car_source_city_name, fixed_price,
                #       origin_sh_price)
                cur.execute(
                    "INSERT INTO dcd_xcx_car (sku_id, car_img_url, car_name, series_name, brand_name, mileage, first_registration_time, car_age, sh_price, title, sub_title, link_url, car_year, car_source_city_name, fixed_price, origin_sh_price) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
                    (sku_id, car_img_url, car_name, series_name, brand_name, mileage, first_registration_time, car_age,
                     sh_price, title, sub_title, link_url, car_year, car_source_city_name, fixed_price, origin_sh_price)
                )
            conn.commit()


if __name__ == '__main__':
    conn = pymysql.connect(host='localhost', user='admin', password='admin147', database='demo', port=3306)
    # 创建一个游标对象
    cur = conn.cursor()
    try:
        mysql_sql(conn, cur)
        # 从数据库中获取已经爬取过的URL
        cur.execute("SELECT url FROM xcx_dcd_url")
        fetched_urls = cur.fetchall()
        # 创建一个集合来存储已经爬取过的URL
        visited_urls = set(url[0] for url in fetched_urls)
        city = input("请输入要爬取的城市:")
        for pagenum in range(0, 6000, 10):
            flag = start_load(requests, city, pagenum, visited_urls, conn, cur)
            if flag == 0:
                break
    except Exception as e:
        print(e)
    finally:
        # 关闭连接
        cur.close()
        conn.close()
 

这篇关于小程序端的懂车帝二手车数据采集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962900

相关文章

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口