哈哈月初的时候老大给我下的爬虫“初级”任务,到九月的最后一天才开始搞??
哎国庆前一天还要上班,真苦逼,只能搞搞爬虫玩一玩了233
ok,进入正题,今天要爬京东图书的数据,所有的图书。这次没有限制,随意发挥,想用什么库都可以,只要能爬??
1.初步分析
既然是要爬所有的图书,那么就得找到所有图书的分类列表,因为分类列表肯定是有全部图书的分类,这一步就可以得到分类list。
进入京东图书,在左边导航栏的最下面有一个全部图书分类的入口。
可以看到真的巨多分类。。。。
随便点几个分类看看
从这里得出,每一个分类都有它的专属tid,前面的cat参数是可以去掉的(去掉不必要的参数),看似有一个tid递增的规律,但是后面点多几个分类发现,事情并没有那么简单。
当我打算把小说分类里面的所有分类都点一编验证这个规律的时候,就发现了”异类“
那我就好奇了,那tid3306是谁?我手动填了tid=3306,居然是科幻小说后面的一个分类。
得知以上信息,我有了个思路,能不能把起始tid和结束tid找到,那么拿到所有图书分类list就轻而易举了。(ps:方法思路千万种,比如selenium什么的,只要能实现即可!)我就去点了一下最后一个分类,看了看他的id,猜测他就是结束的tid。
为了验证,我继续把tid往上加,加了好几位数发现这个确实就是结束tid了。找到结束tid,就顺便再验证一下起始tid。
这个就是第一个坑了,因为第一个分类的itd并不是起始tid,那么可能这个思路就是错的?
这个时候就有了新的思路。把全部分类的列表网页源代码看了一下,有惊喜了。
图上框柱的就是每一个分类的tid,只要我们用正则把tid获取下来,那么所有分类的tid就可以拿到了。换言之,图书分类 URLlist也拿到手了,那么第一步分析就完成啦!
获取tid正则tid = re.findall(‘list.jd.com/.*?-.*?-(.*?).html‘, a)
2.分析分页url
总页数可以在页面源代码上看到,这个正则拿一下就行
total_page = re.findall(‘共<b>(.*?)</b>页‘, a)
然后找一下分页的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.提取数据
这里的话比前面的难度稍大一些,但是问题不大。??
我们要提取的数据如图所示,书名、价格、评价数量、出版信息
因为是边写这篇文章一边分析的。。所以做到这步的时候,刚好中午下班,吃了饭睡了个午觉才继续来肝。这一步分析了30分钟,终于有了突破性进展了??(好菜哦)
我们先来康康要提取的数据是不是动态加载的,如果不是那就最省事了,直接从页面xpath提取即可。
先把这个价格的类名复制,在网页源代码中搜索康康。
行吧,空空如也,那就是动态加载的数据。
我不死心,去看了看商品详情页的价格,然而也是动态加载的。那只能去找找js了。。。
本来不是这个思路的,后面那个思路没走通才来找这里的js,所以也是花了点时间试错,但是问题不大,总归是找到了。
这里我们要关注的几个参数分别是id、m、p
id:图书的skuid
m:图书的定价
p:图书的京东价
商品详情的url中的那串数字就是上面的skuid。京东价和定价也是和js返回的一样。
这边又找到了图书评价数的js
剩下的图书名和出版信息都是可以在源代码中找到的,四个数据提取问题都解决了
先把获取价格和评论数的接口放上来(都是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提取出来。所以这一步也已经完成了!
4. 代码
在敲代码之前,我们重新整理一下思路。
- 先把tid(图书分类id)获取,生成tidlist
- 拿到每一个分类的total_page,生成urllist(这里的url就是当前分类的每一页图书列表url)
- 从urllist中提取skuid,生成skuidlist
- 提取数据
- 存入数据库
根据这个思路,其实大家就已经非常清晰了,代码也不难,大家可以根据自己的实际情况,去选择使用框架或者原生requests去完成。
想要贴主的该次爬取的完整代码,可以在文章下方评论,留下你的邮箱地址~
下一篇爬虫系列文章,会讲到如何使用多进程+异步(协程)增强并发性,还有代理池等等干货,喜欢的朋友给个关注博主吧~????
原文地址:https://www.cnblogs.com/x1you/p/11613177.html