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

2023-12-22 19:21:39
# 首先通过审查元素找到动态网站请求地址
# 通过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")

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

# 首先通过审查元素找到动态网站请求地址
# 通过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()

爬取某本书的详细信息

# 图书详情信息爬取
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")

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

# 图书详情信息爬取
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()

文章来源:https://blog.csdn.net/u010321564/article/details/135153327
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。