【Python爬虫】第四课 动态爬取数据

python 复制代码
# 首先通过审查元素找到动态网站请求地址
# 通过requests访问该地址
# 再使用Json对这些数据进行解析
import requests
import json
# 访问的请求地址
url="https://www.ptpress.com.cn/hotBook/getHotBookList?parentTagId=75424c57-6dd7-4d1f-b6b9-8e95773c0593&rows=18&page=1"
# 获取服务器返回的动态网站数据
data=requests.get(url).text
# 转换json格式
d=json.loads(data)
# 解析第一层,获取参数名字叫data的里面的数据内容
param=d["data"]
#解析图书列表
books=param["rows"]
# 循环遍历所有图书信息
for book in books:
    #获取图片地址
    imagePath=book["picPath"]
    #获得图书价格
    price=book["price"]
    # 折扣后的价格
    discountPrice=book["discountPrice"]
    # 折扣率
    bookDiscount=book["bookDiscount"]
    # 图书名称
    bookName=book["bookName"]
    # 图书编号
    bookId=book["bookId"]
    # 将爬取的数据打印在控制台
    print("图片地址:",imagePath,
          "图书价格:",price,
          "折扣后的价格:",discountPrice,
          "折扣率:",bookDiscount,
          "图书名称:",bookName,
          "图书编号:",bookId)
    print("\n")

将爬取的数据存储至数据库

python 复制代码
# 首先通过审查元素找到动态网站请求地址
# 通过requests访问该地址
# 再使用Json对这些数据进行解析
import requests
import json
def one():
    # 访问的请求地址
    url="https://www.ptpress.com.cn/hotBook/getHotBookList?parentTagId=75424c57-6dd7-4d1f-b6b9-8e95773c0593&rows=18&page=1"
    # 获取服务器返回的动态网站数据
    data=requests.get(url).text
    # 转换json格式
    d=json.loads(data)
    # 解析第一层,获取参数名字叫data的里面的数据内容
    param=d["data"]
    #解析图书列表
    books=param["rows"]
    two(books)


# 定义方法,将爬取的动态数据添加至数据库
import pymysql
def two(books):
    #获得数据库连接
    con=pymysql.connect(host="127.0.0.1",port=3306,
                        user="root",password="root",
                        db="books",charset="utf8")
    # 获得游标
    cursor=con.cursor()
    #循环获取所有图书数据添加至数据库
    # 循环遍历所有图书信息
    for book in books:
        # 获取图片地址
        imagePath = book["picPath"]
        # 获得图书价格
        price = book["price"]
        # 折扣后的价格
        discountPrice = book["discountPrice"]
        # 折扣率
        bookDiscount = book["bookDiscount"]
        # 图书名称
        bookName = book["bookName"]
        # 图书编号
        bookId = book["bookId"]

        #将解析的数据添加至数据库
        cursor.execute("insert into tb_book values(%s,%s,%s,%s,%s,%s)",
                       (bookId,bookName,imagePath,price,bookDiscount,discountPrice))

        #将事务进行提交
        con.commit()

        # 将爬取的数据打印在控制台
        # print("图片地址:", imagePath, "\n",
        #       "图书价格:", price, "\n",
        #       "折扣后的价格:", discountPrice, "\n",
        #       "折扣率:", bookDiscount, "\n",
        #       "图书名称:", bookName, "\n",
        #       "图书编号:", bookId)
        # print("\n")

# 创建程序入口
if __name__ == "__main__":
    one()

爬取某本书的详细信息

python 复制代码
# 图书详情信息爬取
import requests
import json

#指定图书id获得该图书的详细信息
def t1(bookId):
    url=f"https://www.ptpress.com.cn/bookinfo/getBookDetailsById?bookId={bookId}"
    # 获得该图书的详细信息
    req=requests.get(url).text
    # print(req)
    # 使用json对爬取的动态信息进行格式转换
    data=json.loads(req)
    d=data["data"]
    r=d["resume"]
    # 获得内容简介
    n_name=r["name"]
    n_data=r["data"]
    print(n_name)
    print(n_data)

    #获得图书简介
    specialWord=d["specialWord"]
    print(specialWord)

    #获得作者
    author=d["author"]
    print(author)

    #获得作者简介
    a_name=d["authorIntro"]["name"]
    a_data=d["authorIntro"]["data"]
    print(a_name)
    print(a_data)
    #获得图书分类
    bookTypeName=d["bookTypeName"]
    print(bookTypeName)
    # 爬取封面图片
    photos=d["photos"]
    # 用于存储当前图书的所有封面图片
    ps=[]
    for p in photos:
        ps.append(p["picPath"])
    print(ps)
    #获得图书详情
    db=d["bookDetail"]
    db_name=db["name"]
    print(db_name)
    #书籍总页数
    db_pages=db["data"]["pages"]
    print(db_pages)
    # 获得书籍编号
    db_isbn=db["data"]["isbn"]
    print(db_isbn)
    # 书籍格式
    db_format=db["data"]["format"]
    print(db_format)
    # 出版日期
    db_publishDate=db["data"]["publishDate"]
    print(db_publishDate)
    # 版本
    db_edition=db["data"]["edition"]
    print(db_edition)
    # 编辑者
    db_executiveEditor=db["data"]["executiveEditor"]
    print(db_executiveEditor)
    # 书籍样式
    db_frame=db["data"]["frame"]
    print(db_frame)
    # 书籍id
    bi=d["bookId"]
    print(bi)
    # 获得图书目录
    bookDirectory=d["bookDirectory"]
    bookDirectory_data=bookDirectory["data"]
    print(bookDirectory_data)

#指定图书id,获得该图书页面对应的推荐图书
def t2(bookids,rows=9):
    url=f"https://www.ptpress.com.cn/bookinfo/getBookListForRecommend?bookIds={bookids}&rows={rows}"
    text=requests.get(url).text
    data=json.loads(text)
    for d in data["data"]:
        # 图书图片地址
        picPath=d["picPath"]
        if "specialWord" in d:
            # 图书宣传广告
            specialWord=d["specialWord"]
            print(specialWord)
        # 图书价格
        price=d["price"]
        # 折扣后价格
        discountPrice=d["discountPrice"]
        # 折扣率
        bookDiscount=d["bookDiscount"]
        # 书名
        bookName=d["bookName"]
        # 图书id
        bookId=d["bookId"]
        print(picPath)
        print(price)
        print(discountPrice)
        print(bookDiscount)
        print(bookName)
        print(bookId)
        print("-------------------------\n")



if __name__ == "__main__":
    t2("5e6fe0f3-6ee7-40c2-8c25-9cdf9b0c87e6")

爬取所有图书的详细信息并存入数据库

python 复制代码
# 图书详情信息爬取
import requests
import json
import pymysql

#指定图书id获得该图书的详细信息
def t1(bookId):
    url=f"https://www.ptpress.com.cn/bookinfo/getBookDetailsById?bookId={bookId}"
    # 获得该图书的详细信息
    req=requests.get(url).text
    # print(req)
    # 使用json对爬取的动态信息进行格式转换
    data=json.loads(req)
    d=data["data"]
    r=d["resume"]
    # 获得内容简介
    n_name=r["name"]
    n_data=r["data"]
    print(n_name)
    print(n_data)

    #获得图书简介
    specialWord=d["specialWord"]
    print(specialWord)

    #获得作者
    author=d["author"]
    print(author)

    #获得作者简介
    a_name=d["authorIntro"]["name"]
    a_data=d["authorIntro"]["data"]
    print(a_name)
    print(a_data)
    #获得图书分类
    bookTypeName=d["bookTypeName"]
    print(bookTypeName)
    # 爬取封面图片
    photos=d["photos"]
    # 用于存储当前图书的所有封面图片
    ps=[]
    for p in photos:
        ps.append(p["picPath"])
    print(ps)
    #获得图书详情
    db=d["bookDetail"]
    db_name=db["name"]
    print(db_name)
    #书籍总页数
    db_pages=db["data"]["pages"]
    print(db_pages)
    # 获得书籍编号
    db_isbn=db["data"]["isbn"]
    print(db_isbn)
    # 书籍格式
    db_format=db["data"]["format"]
    print(db_format)
    # 出版日期
    db_publishDate=db["data"]["publishDate"]
    print(db_publishDate)
    # 版本
    db_edition=db["data"]["edition"]
    print(db_edition)
    # 编辑者
    db_executiveEditor=db["data"]["executiveEditor"]
    print(db_executiveEditor)
    # 书籍样式
    db_frame=db["data"]["frame"]
    print(db_frame)
    # 书籍id
    bi=d["bookId"]
    print(bi)
    # 获得图书目录
    bookDirectory=d["bookDirectory"]
    bookDirectory_data=bookDirectory["data"]
    print(bookDirectory_data)

#指定图书id,获得该图书页面对应的推荐图书
def t2(bookids,rows=9):
    url=f"https://www.ptpress.com.cn/bookinfo/getBookListForRecommend?bookIds={bookids}&rows={rows}"
    text=requests.get(url).text
    data=json.loads(text)


    # 连接数据库
    con=pymysql.connect(host="127.0.0.1",port=3306,
                        user="root",password="admin",
                        db="books",charset="utf8")
    #获得游标
    cursor=con.cursor()

    for d in data["data"]:
        # 图书图片地址
        picPath=d["picPath"]
        if "specialWord" in d:
            # 图书宣传广告
            specialWord=d["specialWord"]
        else:
            specialWord=""
        # 图书价格
        price=d["price"]
        # 折扣后价格
        discountPrice=d["discountPrice"]
        # 折扣率
        bookDiscount=d["bookDiscount"]
        # 书名
        bookName=d["bookName"]
        # 图书id
        bookId=d["bookId"]

        #判断当前推荐图书是否已经存储在数据库中,如果不存在,则添加,否则就不添加
        sql="select * from tb_tj_book where bookId=%s"
        cursor.execute(sql,(bookId))
        for b in cursor.fetchall():
            if bookId  not in b:
                #将每一本推荐图书信息添加至推荐图书信息表
                sql=""" insert into tb_tj_book values(%s,%s,%s,%s,%s,%s,%s,%s) """
                cursor.execute(sql,(bookId,bookName,bookDiscount,discountPrice,price,specialWord,picPath,bookids))
                #事务提交
                con.commit()


# 查询数据库中所有的图书id
def selectBook():
    # 连接数据库
    con = pymysql.connect(host="127.0.0.1", port=3306,
                          user="root", password="admin",
                          db="books", charset="utf8")
    # 获得游标
    cursor = con.cursor()
    sql="select bookid from tb_book"
    cursor.execute(sql)
    tu=cursor.fetchall()
    # 循环遍历元组,拿出每一个图书id去爬取该图书的9本推荐图书
    for i in tu:
        t2(i[0])




if __name__ == "__main__":
    #t2("5e6fe0f3-6ee7-40c2-8c25-9cdf9b0c87e6")
    selectBook()
相关推荐
李慕婉学姐1 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
吃茄子的猫1 小时前
quecpython中&的具体含义和使用场景
开发语言·python
じ☆冷颜〃1 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
数据大魔方1 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
APIshop1 小时前
Python 爬虫获取 item_get_web —— 淘宝商品 SKU、详情图、券后价全流程解析
前端·爬虫·python
风送雨2 小时前
FastMCP 2.0 服务端开发教学文档(下)
服务器·前端·网络·人工智能·python·ai
效率客栈老秦2 小时前
Python Trae提示词开发实战(8):数据采集与清洗一体化方案让效率提升10倍
人工智能·python·ai·提示词·trae
哈里谢顿2 小时前
一条 Python 语句在 C 扩展里到底怎么跑
python
znhy_232 小时前
day46打卡
python
奋进的芋圆3 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq