吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5383|回复: 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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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, 2025-5-20 11:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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