【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()
相关推荐
Pfolg34 分钟前
Python+ffmpeg实现字幕视频合并
python·ffmpeg·开源软件
积水成江1 小时前
Vite+Vue3+SpringBoot项目如何打包部署
java·前端·vue.js·windows·spring boot·后端·nginx
小鹿( ﹡ˆoˆ﹡ )1 小时前
探索TCP协议的奥秘:Python中的网络通信
网络·python·tcp/ip
哪 吒2 小时前
华为OD机试 - 冠亚军排名(Python/JS/C/C++ 2024 E卷 100分)
javascript·python·华为od
CocoaAndYy2 小时前
ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal原理及Demo
java·jvm·算法
F_D_Z2 小时前
【Python】数据可视化之聚类图
python·信息可视化·聚类
2401_857439693 小时前
SpringBoot在线教育平台:设计与实现的深度解析
java·spring boot·后端
总是学不会.3 小时前
SpringBoot项目:前后端打包与部署(使用 Maven)
java·服务器·前端·后端·maven
DanCheng-studio4 小时前
毕业设计项目 大数据电影数据分析与可视化系统(源码+论文)
python·毕业设计·毕设
IT学长编程4 小时前
计算机毕业设计 视频点播系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·视频点播系统