吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1501|回复: 47
上一主题 下一主题
收起左侧

[Python 原创] Python爬取孔夫子旧书网数据信息

[复制链接]
跳转到指定楼层
楼主
Qinmuyi 发表于 2024-12-2 21:44 回帖奖励

写了一个爬取孔夫子旧书网计算机与互联网书籍 数据信息的爬虫程序

爬取网址:
https://search.kongfz.com/booklib/category?catId=31&actionPath=catId&hasStock=true&page=1

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

功能:

  1. 可以将爬取数据保存为Excel文件
  2. 可以将爬取数据保存到MySQL数据库,前提是创建了spider数据库

创建数据库: create database spider



该程序的运行结果图:
初始截图:


将数据保存为Excel文件



将数据保存到MySQL中



退出:


以下是相关代码:

# -*- 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可执行文件


主分享链接: https://www.123684.com/s/v7abVv-MjZph提取码:ZA0b
备用分享链接:https://www.123865.com/s/v7abVv-MjZph提取码:ZA0b

初学爬虫,若有错误或想法,欢迎大家讨论


免费评分

参与人数 5吾爱币 +12 热心值 +5 收起 理由
vsnic + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
kerrychu + 1 + 1 谢谢@Thanks!
JW1124 + 1 + 1 谢谢@Thanks!
wapjsx + 2 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
zoomyou 发表于 2024-12-3 08:55
这个软件不错,不过网盘下载要收费,而且竟然有444M这么大吗?最近在研究如何爬取谷歌、脸书、领英的相关数据,希望能与楼主互相学习进步,谢谢分享!
推荐
 楼主| Qinmuyi 发表于 2024-12-3 10:59 |楼主
本帖最后由 Qinmuyi 于 2024-12-3 11:02 编辑
gc1368 发表于 2024-12-3 10:43
带账号密码认证的 怎么爬?

目前我用过的就是selenium和Scrapy可以携带账号密码爬取数据,设置Cookie也可以携带账号密码信息, 如果有其他技术,望告知
沙发
满庭枫 发表于 2024-12-3 05:24
3#
sg6465038 发表于 2024-12-3 07:47
楼主谦虚了,这可不像初学者写的
4#
WERWE123 发表于 2024-12-3 08:06
楼主,厉害了
5#
lq123456789 发表于 2024-12-3 08:09
可以的哦 ,站个坑,啥时候有其它学科的再说
6#
wzyzhuce 发表于 2024-12-3 08:53
对于学习PYTHON的人来说这段代码具有参考和学习的价值。
8#
god072009 发表于 2024-12-3 09:04
也在学爬虫 块放弃了 还好楼主给了勇气
9#
jarvis123 发表于 2024-12-3 09:43
牛,狠狠学习一波
10#
maxwd 发表于 2024-12-3 09:44
谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-6 04:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表