异步图书爬虫

前言

香在衣裳妆在臂,水莲芳草月连云 ----- 守住当下

又水了一段时间,2023年是后疫情时代全球经济下行的一个开端,这仅仅只是开始,公司最近裁掉了很多部门,国企亦不能支撑过于庞大的群体,大家一定要慎重对待工作,善待自己!

回归正题!

目标网站:https://www.epubit.com/books

因为发爬机制不强,所以这里就贴出原网址,后续逆向破解采用base64编码加密目标网站,解码即可查看!

一:看规则

鼠标右键检查,或者直接f12抓包,选择xhr请求,可以看到如下json数据!

这种属于典型的ajax案例,这里简单说一下ajax的特点:一般我们点击下一页数据的时候,网址是不会变化的,数据是通过ajax 请求过来的,这种数据比写xpath好提取多了!

二:码代码

import requests
from fake_useragent import UserAgent
from pymongo import MongoClient

这里导入相应的库,并保存到mongo数据库中,接下来看一下参数:

1代表页数,row代表每页的图书的数量20,然后我们用类去实现它:

class CatchYibuBook:
    def __init__(self):
        self.url = f'https://www.epubit.com/pubcloud/content/front/portal/getUbookList'
        # 初始化MongoDB数据库并创建数据库连接
        self.mongo_address = '127.0.0.1'
        self.client = MongoClient(self.mongo_address, 27017)
        self.db = self.client['book']
        self.col = self.db['yibutushu']

    def get_data(self, i):
        headers = {
            'Origin-Domain': 'www.epubit.com',
            'User-Agent': UserAgent().random
        }
        params = {
            'page': i,
            'row': 20,
            'startPrice': None,
            'endPrice': None,
            'tagId': None,
        }

三:提取数据

我们需要拿到每本书的价格,名称以及书名和书的链接等,除了这些后续自己补加需要的数据代码即可:

res = requests.get(self.url, headers=headers, params=params, proxies=get_proxies())
        data = res.json()
        for i in range(0, 20):
            item = {}
            item['book_name'] = data['data']['records'][i]['name']
            item['book_author'] = data['data']['records'][i]['authors']
            item['book_price'] = data['data']['records'][i]['price']
            item['book_tagNames'] = data['data']['records'][i]['tagNames']
            item['book_link'] = "https://www.epubit.com/bookDetails?id=" + data['data']['records'][0]['code']
            self.col.insert_one(item)
            print(item)

然后我们定义一个主函数去执行:放入数据库中

def run(self, page):
        for i in range(1, page+1):
            # 设置抓取数据的页数
            catch_msg.get_data(i)
        # 断开连接mongo
        self.client.close()

最后定义脚本的执行入口:

if __name__ == '__main__':
    num = int(input("请输入需要爬取的页数:"))
    # 实例化对象
    catch_msg = CatchYibuBook()
    catch_msg.run(num)

四:结果

可以看到我们拿到了想要的数据。

总结:json格式数据好提取,找到对应的包就行,至于用类的格式写的爬虫脚本,有些人喜欢用函数,因人而异!

下期再见

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值