帮粉丝写Python爬虫之【微x读书书籍信息爬取】

665 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情

X同学发私信说想要微信读书上的书籍清单做测试用,吓我一跳,原以为是要爬取APP呢,刚换了新笔记本难道要配置新的开发环境,结果是爬取一个PC端的网站,虚惊一场。

写在前面

本篇博客要爬取的页面是微信读书的PC端页面,不过并不是把书籍下载下来,只是抓取信息,所以整体实现难度不大,为了简化操作,我将书籍分类与书籍数目做成可输入项。

页面地址为:weread.qq.com/

要爬取的数据为:

image.png

点击具体某一分类榜单,地址为: weread.qq.com/web/categor… 后面的数字ID是类别号,页面下拉刷新,加载的页面是

weread.qq.com/web/bookLis…

注意这里除了类别号以外,后面的maxIndex就是每页的数据了,经过测试,数据呈现以下情形。

https://weread.qq.com/web/bookListInCategory/100000?maxIndex=0
https://weread.qq.com/web/bookListInCategory/100000?maxIndex=20
https://weread.qq.com/web/bookListInCategory/100000?maxIndex=40
... 

有了上述的这些分析之后,剩下的就是逐步将其实现的过程了

编码时间

对于爬虫代码的编写,咱们爬虫百例课程中一直反复强调过,核心是分页数据,数据分析到之后,剩余的操作就变得简单了。 具体代码可查看,我将代码部分解释写到注释里面,因为没有特别难得地方,所以可以直接对照编写。


import requests
import json
headers = {
    "user-agent": "Mozilla/5.0 使用你自己找到的UA即可",
    "referer": "https://weread.qq.com/"
}


def get_category(category_num, totle):
    pages = int(totle/20)  # 获取总页码数

    if (pages % 20) > 0:  # 如果页码除以20还有余数,页码数+1,方便获取到全部数据
        pages += 1

    for page in range(0, pages+1):
        url = f"https://weread.qq.com/web/bookListInCategory/{category_num}?maxIndex={page*20}" # f-strings格式化字符串
        res = requests.get(url, headers=headers)

        data = res.json()
        books = data["books"]

        write_data = []

        for book in books:
            title = book["bookInfo"]["title"]

            author = book["bookInfo"]["author"]
            price = book["bookInfo"]["price"]

            intro = book["bookInfo"]["intro"]  # 描述在写入csv文件的时候回出现换行,如果你写入csv文件,可以忽略
            star = book["bookInfo"]["star"]

            readingCount = book["readingCount"]
            try:
                lPushName = book["bookInfo"]["lPushName"].strip() # 去除空格
            except Exception as e:
                lPushName = ""

            one_str = f"{title},{author},{price},{lPushName},{star},{readingCount}"
            print(one_str)
            # write_data.append(one_str)
			# 数据量不大,可以每页数据都存储一次,数据量如果过大,需要调整  
            with open("./books.csv", "a", encoding="utf-8-sig") as f:
                f.write(one_str+"\n")


if __name__ == "__main__":
    totle = 21
    category_num = 100000
    # totle = int(input("请输入书籍总数目:"))  # 解除注释,即可实现手动输入
    # category_num = int(input("请输入书籍类别ID:"))
    get_category(category_num, totle)

写在后面

本案例实现难度不大,核心还是分析,分析,分析。请牢记对于任何爬虫爱好者来说,熟练的分析页面,找到解析数据的突破口就相当于把爬虫实现了90%,而剩下的只是一些修修补补的造轮子过程。

广宣时间

如果你想跟博主建立亲密关系,可以关注 “梦想橡皮擦”,近距离接触一个逗趣的互联网高级网虫。 博主 ID:梦想橡皮擦,希望大家点赞、评论、收藏。

【帮粉丝写爬虫】会成为这个系列的最后10篇内容,如果你有想要爬取的网站,在评论区告诉我吧