爬虫从入门到放弃(四)

哈哈月初的时候老大给我下的爬虫“初级”任务,到九月的最后一天才开始搞?

哎国庆前一天还要上班,真苦逼,只能搞搞爬虫玩一玩了233

ok,进入正题,今天要爬京东图书的数据,所有的图书。这次没有限制,随意发挥,想用什么库都可以,只要能爬?

1.初步分析

既然是要爬所有的图书,那么就得找到所有图书的分类列表,因为分类列表肯定是有全部图书的分类,这一步就可以得到分类list。

进入京东图书,在左边导航栏的最下面有一个全部图书分类的入口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WFYeN5V5-1569831096838)(https://s2.ax1x.com/2019/09/30/uYc4gJ.png)]

可以看到真的巨多分类。。。。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QTzclknh-1569831096839)(https://s2.ax1x.com/2019/09/30/uYcbE6.png)]

随便点几个分类看看

uYcvgH.png

uYcxvd.png

uYgpDI.png

从这里得出,每一个分类都有它的专属tid,前面的cat参数是可以去掉的(去掉不必要的参数),看似有一个tid递增的规律,但是后面点多几个分类发现,事情并没有那么简单。

当我打算把小说分类里面的所有分类都点一编验证这个规律的时候,就发现了”异类“

uYgZvj.png

uYgubq.png

那我就好奇了,那tid3306是谁?我手动填了tid=3306,居然是科幻小说后面的一个分类。

uYgQaV.png

得知以上信息,我有了个思路,能不能把起始tid和结束tid找到,那么拿到所有图书分类list就轻而易举了。(ps:方法思路千万种,比如selenium什么的,只要能实现即可!)我就去点了一下最后一个分类,看了看他的id,猜测他就是结束的tid。

uYg8GF.png

为了验证,我继续把tid往上加,加了好几位数发现这个确实就是结束tid了。找到结束tid,就顺便再验证一下起始tid。

这个就是第一个坑了,因为第一个分类的itd并不是起始tid,那么可能这个思路就是错的?

这个时候就有了新的思路。把全部分类的列表网页源代码看了一下,有惊喜了。

uYgUq1.md.png

图上框柱的就是每一个分类的tid,只要我们用正则把tid获取下来,那么所有分类的tid就可以拿到了。换言之,图书分类 URLlist也拿到手了,那么第一步分析就完成啦!

获取tid正则tid = re.findall('list.jd.com/.*?-.*?-(.*?).html', a)

2.分析分页url

总页数可以在页面源代码上看到,这个正则拿一下就行

total_page = re.findall('共<b>(.*?)</b>页', a)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GJ9F8tLq-1569831096842)(https://s2.ax1x.com/2019/09/30/uYgDPO.png)]

然后找一下分页的url变化,随便选一个分类,查看前几页的url

https://list.jd.com/list.html?tid=3297&page=1&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main

https://list.jd.com/list.html?tid=3297&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main

https://list.jd.com/list.html?tid=3297&page=3&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main

可以看到,url的参数仅仅是page变了,tid就是图书的分类,其他的参数去掉也是可以的。那么我们的url可以简化为

https://list.jd.com/list.html?tid=3297&page=1

ok,第二步就搞定了

3.提取数据

这里的话比前面的难度稍大一些,但是问题不大。?

我们要提取的数据如图所示,书名、价格、评价数量、出版信息

uYgHMj.png

因为是边写这篇文章一边分析的。。所以做到这步的时候,刚好中午下班,吃了饭睡了个午觉才继续来肝。这一步分析了30分钟,终于有了突破性进展了?(好菜哦)

我们先来康康要提取的数据是不是动态加载的,如果不是那就最省事了,直接从页面xpath提取即可。

先把这个价格的类名复制,在网页源代码中搜索康康。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dxg4hih1-1569831096843)(https://s2.ax1x.com/2019/09/30/uYgXd0.png)]

行吧,空空如也,那就是动态加载的数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pla6SVfk-1569831096844)(https://s2.ax1x.com/2019/09/30/uY2iLR.png)]

我不死心,去看了看商品详情页的价格,然而也是动态加载的。那只能去找找js了。。。

本来不是这个思路的,后面那个思路没走通才来找这里的js,所以也是花了点时间试错,但是问题不大,总归是找到了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EeDFdeTU-1569831096844)(https://s2.ax1x.com/2019/09/30/uY2eJO.png)]

这里我们要关注的几个参数分别是id、m、p

id:图书的skuid

m:图书的定价

p:图书的京东价

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hak94XYy-1569831096844)(https://s2.ax1x.com/2019/09/30/uY2KQH.png)]

商品详情的url中的那串数字就是上面的skuid。京东价和定价也是和js返回的一样。

这边又找到了图书评价数的js

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HzperEdS-1569831096845)(https://s2.ax1x.com/2019/09/30/uY2alQ.png)]

剩下的图书名和出版信息都是可以在源代码中找到的,四个数据提取问题都解决了

先把获取价格和评论数的接口放上来(都是GET请求)

获取价格接口:
https://p.3.cn/prices/mgets?skuIds=J_11711801%2CJ_12160627%2CJ_12041776%2CJ_11982172%2CJ_12216733%2CJ_12312047%2CJ_12213837%2CJ_12174923%2CJ_12577886%2CJ_10199768%2CJ_11711801%2CJ_11982170%2CJ_12182317%2CJ_12371485%2CJ_12217595%2CJ_12370112%2CJ_12403862%2CJ_12684700%2CJ_12184621%2CJ_11439872%2CJ_12354843%2CJ_12290386%2CJ_12167292%2CJ_11800268%2CJ_12670276%2CJ_12505366%2CJ_11837713%2CJ_12288371%2CJ_12547666%2CJ_12400655

获取评论数:https://club.jd.com/comment/productCommentSummaries.action?my=pinglun&referenceIds=12508277,12090377,11757834,12192773,12533325,12568226,10960247,10616501,12018031,12174897,12629538,12262747,12155241,12174895,12173835,10019917,11711801,12512363,12108531,12052646,12490025,12461181,11716978,12213869,12489747,11982184,12430144,12052514,12271618,10367073

这里多余的参数我已经去掉了,可以看出,基本上只需要skuid作为请求参数就可以获取到我们想要的数据。最后只有一个问题了,那就是skuidlist怎么获取。

从图书详情页和图书列表页的网页源代码得知,skuid可以用正则或者xpth提取出来。所以这一步也已经完成了!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-meKhQsZ4-1569831096845)(https://s2.ax1x.com/2019/09/30/uY2ykV.png)]

4. 代码

在敲代码之前,我们重新整理一下思路。

  1. 先把tid(图书分类id)获取,生成tidlist
  2. 拿到每一个分类的total_page,生成urllist(这里的url就是当前分类的每一页图书列表url)
  3. 从urllist中提取skuid,生成skuidlist
  4. 提取数据
  5. 存入数据库

根据这个思路,其实大家就已经非常清晰了,代码也不难,大家可以根据自己的实际情况,去选择使用框架或者原生requests去完成。

想要贴主的该次爬取的完整代码,可以在文章下方评论,留下你的邮箱地址~

下一篇爬虫系列文章,会讲到如何使用多进程+异步(协程)增强并发性,还有代理池等等干货,喜欢的朋友给个关注博主吧~??

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值