前言
香在衣裳妆在臂,水莲芳草月连云 ----- 守住当下
又水了一段时间,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格式数据好提取,找到对应的包就行,至于用类的格式写的爬虫脚本,有些人喜欢用函数,因人而异!
下期再见