爬虫从入门到放弃(四)

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

哎国庆前一天还要上班,真苦逼,只能搞搞爬虫玩一玩了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. 代码

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

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

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

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

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

原文地址:https://www.cnblogs.com/x1you/p/11613177.html

时间: 2024-10-06 00:58:52

爬虫从入门到放弃(四)的相关文章

python爬虫从入门到放弃(四)之 Requests库的基本使用

什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现,其实urllib还是非常不方便的,而Requests它会比urllib更加方便,可以节约我们大量的工作.(用了requests之后,你基本都不愿意用urllib了)一句话,requests是python实现的最简单易用的HTTP库,建议爬虫使用requests库. 默认安装好python之后,是没有安

Python爬虫从入门到放弃(十四)之 Scrapy框架中选择器的用法

Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中选择节点的语言,也可以用在HTML上.CSS是一门将HTML文档样式化语言,选择器由它定义,并与特定的HTML元素的样式相关联. XPath选择器 常用的路径表达式,这里列举了一些常用的,XPath的功能非常强大,内含超过100个的内建函数.下面为常用的方法 nodeName 选取此节点的所有节点 / 从根节点选取 // 从匹配选

Python爬虫从入门到放弃(十九)之 Scrapy爬取所有知乎用户信息(下)

在上一篇文章中主要写了关于爬虫过程的分析,下面是代码的实现,完整代码在:https://github.com/pythonsite/spider items中的代码主要是我们要爬取的字段的定义 class UserItem(scrapy.Item): id = Field() name = Field() account_status = Field() allow_message= Field() answer_count = Field() articles_count = Field()

Python爬虫从入门到放弃(十一)之 Scrapy框架整体的一个了解

这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider/tree/master/jobboleSpider 注:这个文章并不会对详细的用法进行讲解,是为了让对scrapy各个功能有个了解,建立整体的印象. 在学习Scrapy框架之前,我们先通过一个实际的爬虫例子来理解,后面我们会对每个功能进行详细的理解.这里的例子是爬取http://blog.jobb

python爬虫从入门到放弃(六)之 BeautifulSoup库的使用

上一篇文章的正则,其实对很多人来说用起来是不方便的,加上需要记很多规则,所以用起来不是特别熟练,而这节我们提到的beautifulsoup就是一个非常强大的工具,爬虫利器. beautifulSoup “美味的汤,绿色的浓汤” 一个灵活又方便的网页解析库,处理高效,支持多种解析器.利用它就不用编写正则表达式也能方便的实现网页信息的抓取 快速使用 通过下面的一个例子,对bs4有个简单的了解,以及看一下它的强大之处: from bs4 import BeautifulSoup html = '''

python爬虫从入门到放弃(三)之 Urllib库的基本使用

官方文档地址:https://docs.python.org/3/library/urllib.html 什么是Urllib Urllib是python内置的HTTP请求库包括以下模块urllib.request 请求模块urllib.error 异常处理模块urllib.parse url解析模块urllib.robotparser robots.txt解析模块 urlopen 关于urllib.request.urlopen参数的介绍:urllib.request.urlopen(url,

Python爬虫从入门到放弃(二十一)之 Scrapy分布式部署

按照上一篇文章中我们将代码放到远程主机是通过拷贝或者git的方式,但是如果考虑到我们又多台远程主机的情况,这种方式就比较麻烦,那有没有好用的方法呢?这里其实可以通过scrapyd,下面是这个scrapyd的github地址:https://github.com/scrapy/scrapyd 当在远程主机上安装了scrapyd并启动之后,就会再远程主机上启动一个web服务,默认是6800端口,这样我们就可以通过http请求的方式,通过接口的方式管理我们scrapy项目,这样就不需要在一个一个电脑连

python爬虫从入门到放弃(八)之 Selenium库的使用

一.什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid).Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上. selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问

Python爬虫从入门到放弃(十)之 关于深度优先和广度优先

网站的树结构 深度优先算法和实现 广度优先算法和实现 网站的树结构 通过伯乐在线网站为例子: 并且我们通过访问伯乐在线也是可以发现,我们从任何一个子页面其实都是可以返回到首页,所以当我们爬取页面的数据的时候就会涉及到去重的问题,我们需要将爬过的url记录下来,我们将上图进行更改 在爬虫系统中,待抓取URL队列是很重要的一部分,待抓取URL队列中的URL以什么样的顺序排队列也是一个很重要的问题,因为这涉及到先抓取哪个页面,后抓取哪个页面.而决定这些URL排列顺序的方法,叫做抓取策略.下面是常用的两