Python爬取孔夫子旧书网数据信息

查看 56|回复 10
作者:Qinmuyi   
写了一个爬取孔夫子旧书网计算机与互联网书籍 数据信息的爬虫程序
爬取网址:
https://search.kongfz.com/booklib/category?catId=31&actionPath=catId&hasStock=true&page=1

因为该程序获取的是网页加载的json数据,所以目前只能获取计算机与互联网 的书籍信息

功能:
[ol]
  • 可以将爬取数据保存为Excel文件
  • 可以将爬取数据保存到MySQL数据库,前提是创建了spider数据库
    [/ol]
    创建数据库: create database spider
    该程序的运行结果图:
    初始截图:


    初始.jpg (18.69 KB, 下载次数: 0)
    下载附件
    初始
    2024-12-2 21:29 上传

    将数据保存为Excel文件


    Excel保存.jpg (48.7 KB, 下载次数: 0)
    下载附件
    Excel
    2024-12-2 21:29 上传



    excel结果.jpg (421.68 KB, 下载次数: 0)
    下载附件
    2024-12-2 21:31 上传

    将数据保存到MySQL中


    MySQL保存.jpg (49.38 KB, 下载次数: 0)
    下载附件
    2024-12-2 21:30 上传



    mysql结果.jpg (191.35 KB, 下载次数: 0)
    下载附件
    2024-12-2 21:32 上传

    退出:


    退出.jpg (22.85 KB, 下载次数: 0)
    下载附件
    2024-12-2 21:30 上传

    以下是相关代码:
    # -*- coding: UTF-8 -*-
    '''
    @Project :网络爬虫
    @file    :kfz_demo2.py
    @IDE     :PyCharm
    @AuThor  :慕逸
    @date    :02/12/2024 15:21
    @Description :  爬取孔夫子旧书网信息
    '''
    # TODO: 注意:在保存到MySQL数据库时,需要先创建一个名为spider的数据库
    import json
    import os
    import pandas as pd
    import pymysql
    from tqdm import tqdm
    import requests
    class KfzDemo2():
        def __init__(self, url):
            self.headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
            }
            self.url = url
        def get_html(self):
            response = requests.get(url=self.url, headers=self.headers)
            context = response.content
            return context
        def get_data(self):
            context = self.get_html()
            data = json.loads(context)['data']['itemResponse']['list']
            data_lis = []
            for d in data:
                data_dic = {}
                data_dic['type'] = d['type']
                data_dic['书籍名称'] = d['bookName']
                # data_dic['bigImgUrl'] = d['imgUrlEntity']['bigImgUrl']
                # data_dic['smallImgUrl'] = d['imgUrlEntity']['smallImgUrl']
                data_dic['新书价格'] = d['newBookMinPrice']
                data_dic['新书余量'] = d['newBookOnSaleNum']
                data_dic['旧书价格'] = d['oldBookMinPrice']
                data_dic['旧书余量'] = d['oldBookOnSaleNum']
                data_dic['书籍信息'] = d['bookShowInfo']
                data_lis.append(data_dic)
            # print(data_lis)
            return data_lis
        def save_data(self, data):
            df = pd.DataFrame(data)
            # 保存到Excel文件
            df.to_excel('output.xlsx', index=True)
            save_path = os.path.abspath('output.xlsx')
            print("数据已成功保存到 Excel 文件,保存位置为: ", save_path)
        def save_data_to_mysql(self, data: list):
            # 连接到mysql数据库
            db_config = {
                'host': 'localhost',
                'user': 'root',
                'password': '123456',
                'database': 'spider',
            }
            # 连接到数据库
            connection = pymysql.connect(**db_config)
            try:
                with connection.cursor() as cursor:
                    create_table = '''
                    CREATE TABLE IF NOT EXISTS books (
                        id INT AUTO_INCREMENT PRIMARY KEY,
                        type VARCHAR(50),
                        `书籍名称` VARCHAR(255),
                        `新书价格` DECIMAL(10, 2),  -- 假设价格有小数点,使用DECIMAL更合适
                        `新书余量` INT,            -- 假设余量是整数
                        `旧书价格` DECIMAL(10, 2),
                        `旧书余量` INT,
                        `书籍信息` JSON
                    )
                    '''
                    cursor.execute(create_table)
                    # 插入数据
                    for d in tqdm(data, desc='正在存储数据'):
                        insert_sql = '''
                                INSERT INTO books (type, `书籍名称`, `新书价格`, `新书余量`, `旧书价格`, `旧书余量`, `书籍信息`)
                                VALUES (%s, %s, %s, %s, %s, %s, %s)
                                '''
                        val = (d['type'], d['书籍名称'], d['新书价格'], d['新书余量'], d['旧书价格'], d['旧书余量'],
                               json.dumps(d['书籍信息']))
                        cursor.execute(insert_sql, val)
                    # 提交事务
                    connection.commit()
                    print("数据已成功插入到 MySQL 数据库")
            finally:
                connection.close()
    def main():
        while True:
            data = []
            kfz = KfzDemo2(None)
            # 请输入需要数据需要保存的类型
            category_save = input(
                "**********************\n"
                "     【1】Excel(.xlsx)\n"
                "     【2】MySQL\n"
                "     【3】退出程序\n"
                "**********************\n"
                "请输入需要数据需要保存的类型的数字:"
            )
            print("**********************")
            if category_save == '3':
                print("程序已退出")
                break
            elif category_save not in ['1', '2']:
                print("输入错误,请重新输入!!!!")
                continue
            for i in tqdm(range(1, 101), desc='正在爬取数据'):  # 101
                url = "https://search.kongfz.com/pc-gw/search-web/client/pc/bookLib/category/list?catId=31&actionPath=catId&page={}".format(i)
                kfz.url = url
                data_lis = kfz.get_data()
                data.extend(data_lis)
            print("共获取{}条数据".format(len(data)))
            if category_save == '1':
                kfz.save_data(data)
            elif category_save == '2':
                try:
                    kfz.save_data_to_mysql(data)
                except pymysql.err.OperationalError as e:
                    if e.args[0] == 1049:  # 错误码 1049 表示数据库不存在
                        print(
                            "****************************\n数据库不存在,请创建数据库后重新尝试\n****************************")
                    else:
                        print(f"An error occurred: {e}")
            # 当数据库不存在时,会抛出数据库不存在异常
    if __name__ == '__main__':
        main()
    程序已经打包成.exe可执行文件


    软件截图.jpg (12.5 KB, 下载次数: 0)
    下载附件
    2024-12-2 21:44 上传

    主分享链接: https://www.123684.com/s/v7abVv-MjZph提取码:ZA0b
    备用分享链接:https://www.123865.com/s/v7abVv-MjZph提取码:ZA0b
    初学爬虫,若有错误或想法,欢迎大家讨论

    余量, 数据

  • zoomyou   

    这个软件不错,不过网盘下载要收费,而且竟然有444M这么大吗?最近在研究如何爬取谷歌、脸书、领英的相关数据,希望能与楼主互相学习进步,谢谢分享!
    Qinmuyi
    OP
      


    gc1368 发表于 2024-12-3 10:43
    带账号密码认证的 怎么爬?

    目前我用过的就是selenium和Scrapy可以携带账号密码爬取数据,设置Cookie也可以携带账号密码信息, 如果有其他技术,望告知
    满庭枫   

    666666666666666666666
    sg6465038   

    楼主谦虚了,这可不像初学者写的
    WERWE123   

    楼主,厉害了
    lq123456789   

    可以的哦 ,站个坑,啥时候有其它学科的再说
    wzyzhuce   

    对于学习PYTHON的人来说这段代码具有参考和学习的价值。
    god072009   

    也在学爬虫 块放弃了 还好楼主给了勇气
    jarvis123   

    牛,狠狠学习一波
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部