吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4290|回复: 16
收起左侧

[Python 转载] 爬取京东图书销量榜信息(附带分析过程)

   关闭 [复制链接]
wuse111 发表于 2022-3-29 11:09
一.分析
打开京东图书的排行榜(https://book.jd.com/booktop/0-0-0.html?category=3287-0-0-0-10001),可以看到页面有图书销量和热销榜,还有月份和时间的分类

首先打开浏览器自带的开发者工具(按f12就能打开),然后刷新页面(快捷键ctrl+r),接着找到页面的数据包点击查找信息,点击response里面搜索是否存在图书信息
image.png

搜索之后发现找不到图书信息,但是在抓取的数据包里面存在图书的图片和内容,那么数据就存在别的数据包,那么就要用到过滤的方式,在下图的这一栏进行过滤
每一个有什么用就不科普了,这个网上搜一下就知道了

接下来快速的方法,如果图书信息如果不存在页面里,那么会以json或jsonp方式传给浏览器,但是这种情况并不是绝对的,可以试着以这条规则寻找
image.png
选择xhr和js的筛选按钮进行查找(觉得不理解可以看一下这个回答下面的说明:https://www.zhihu.com/question/271333230)
进行筛查之后发现在js里面,找到包含图书信息的数据包,preview下明显看到图书信息分布,这样的方式查看数据对后面根据键值提取数据有用
image.png
分析到这里就结束了

二.代码
[Python] 纯文本查看 复制代码
import requests
import time
import json
import re


def crawl_jd_books():
    # 设置请求头部,伪装ua
    headers = {
        'User-Agent': 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
        'referer': 'https://book.jd.com/'}
    # 设置存储图书信息的列表,当然也可以用其他的方式存储
    books_info = []
    # 页面只有5页,设置一个循环就可以
    for n in range(1, 6):
        # 方式一:直接复制数据包里编码好的url进行访问
        # url = f'https://gw-e.jd.com/client.action?callback=func&body=%7B%22moduleType%22%3A1%2C%22page%22%3A{n}%2C%22pageSize%22%3A20%2C%22scopeType%22%3A1%7D&functionId=bookRank&client=e.jd.com&_={str(int(round(time.time() * 1000)))}'
        # response = requests.get(url,headers=headers)
        # 方式二:通过json解码进行dumps这个,通过params方式提交
        # moduleType取值(1,2)代表图书销量榜和新书热卖榜,page代表页数,scopetype(1,2,3)表示榜单的选择(其中月榜后面会多一个month的参数代表月份)
        #{"moduleType":1,"page":1,"pageSize":20,"scopeType":3,"month":1}
        body = json.dumps({"moduleType": 1, "page": n, "pageSize": 20, "scopeType": 1})
        param = {
            "callback": "func",
            "body": body,
            "functionId": "bookRank",
            "client": "e.jd.com",
            "_": int(round(time.time() * 1000))  # 13位时间戳
        }
        url = 'https://gw-e.jd.com/client.action'
        response = requests.get(url, params=param, headers=headers)
        # 返回的并非标准的json格式,通过正则进行处理取值,然后通过json处理标准
        json_deal = re.search('func\((.*?)\}\)', response.text).group(1) + '}'
        json_back = json.loads(json_deal)
        book_list = json_back['data']['books']
        for i in book_list:
            # 图书id
            book_id = i['bookId']
            # 图书名称
            book_name = i['bookName']
            # 图书出版社
            publisher = i['publisher']
            # 图书链接
            item_url = f'https://item.jd.com/{book_id}.html'
            # 京东售价
            sell_price = i['sellPrice']
            # 原有定价
            define_price = i['definePrice']
            if define_price == '':
                old_price = 0
            else:
                old_price = define_price
            books_info.append((book_id, book_name, sell_price, old_price, publisher, item_url))
    return books_info

if __name__ == '__main__':
    crawl_jd_books()


代码中没有写报错代码,可以自行添加,文章表达和排版不是很好,有错误请指出
分析和代码仅提供思路和方法,请勿非法使用

免费评分

参与人数 2热心值 +2 收起 理由
asgh56 + 1 用心讨论,共获提升!
XINJIAN9 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| wuse111 发表于 2022-3-31 17:49
wobiye2006 发表于 2022-3-30 11:47
感谢分享,请问有同类型更替其他的检索吗?最新想看京东外设的

思路差不多,可以自己去试试
henrylong1989 发表于 2022-3-29 11:30
o824 发表于 2022-3-29 13:02
photocs 发表于 2022-3-29 13:48
学习了,谢谢
qwe12079 发表于 2022-3-29 13:57
谢谢谢谢学习一下
lishikai 发表于 2022-3-29 14:15
学习学习
linhzye 发表于 2022-3-29 14:58
这个思路不用抓取页面代码,直接获取json就可以了
头像被屏蔽
xiadongming 发表于 2022-3-29 20:59
提示: 作者被禁止或删除 内容自动屏蔽
古月银狐 发表于 2022-3-30 00:36
向你学习,谢谢分享!感谢
kon2021 发表于 2022-3-30 08:33
学习了,
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-12 05:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表