"第一遍是学习,第二遍是看看自己到底有没有认真的学习" -- by 我自己

这个commit我想做的拿到一本书的好评率,听起来又更有意义了一点。在reset到相应的commit之后,使用如下命令:

在删除第53行再改掉把最后一个pass注释掉,启用最后一个print,啊,原谅我这轻率的commit吧。你应该能看到如下的结果:

那么,如何拿到这个好评率呢?首先好评率并不在这个第一个页面里,他是要点进每一个图书的详情页面里才能看到。并且,准确的说,在一个tab里面,有网购经验的人应该很熟练的就能找到。剩下来,先上三板斧,用选择工具找到元素,构建出需要的元素-标识-名称三元组,传到BeautifulSoup中,执行!很好,又一次被打脸,啥也弄不出来。有了上一次的经验,很明显,这又是一次回调。那么问题就简单了,毕竟已经处理过同样的问题一次了。根据上一节相同的逻辑,找到这个callback接口。同样是有点长,同样,你可以按照上一节的方法,慢慢的试到一个最短的路径,但是,我的懒病又犯了,这一次,我决定就用这么长的接口了!

https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv4374&productId=xxx&score=0&sortType=5&page=0&pageSize=xxx&isShadowSku=0&fold=1"

我在两个地方用了xxx,一个是Id,一个是pageSize。Id好理解,为啥这个pageSize我要重点突出呢?因为如果你手痒打出了这个接口的输出,他大概是长这个样子的:这个json字符串返回的信息有点多,不仅仅有我需要的好评率,虽然淹没在茫茫大海之中,还有用户评论!很明显,对于很多爬虫爱好者,这是一个非常有用的信息。而虽然我这个爬虫里并没有对这个有啥有意思的期望,但是我的经验,把任何你可能感兴趣的内容设计成参数,对以后肯定是有好处的。

好评率在这个json字符串中并不好找,但是也不算难找,你应该很敏感的看到有个字段叫goodRateShow,后面有一个数字,再看看页面上的数字,很明显,这个就是好评率。但是这个是嵌套在另外一个json结构之中的,叫productCommentSummray。但是这些,都不是问题,对于python,不过是字典里面包含一个字典而已,请看第54行:细心观察的人会发现,这次传入BeautifulSoup构造函数多了一个参数,如果你有手贱的毛病,会忍不住删除这个参数然后试试。当然,如果你有相关的开发经验,会立马知道,一大堆乱码会向你袭来。这里传入的参数是字符编码格式或者说是标准。这里最常听到的应该是utf-8,utf-16,而大多数网页或者从服务器传回的文件都会采用这个编码,所以在处理英语网站的时候,绝大多数时候你可以忽略这个参数。但是毕竟中文是博大精深的语言,所以很多时候会采用gb18030这个标准,这个gb,就是国标的意思。在这里使用采用这个参数你可以说是我猜测的,或者是我的经验所致。一点也不科学,一点也工程。有没有办法获取到这个确定的编码呢?当然有!

python中有个包,叫做chardet,而想拿到这个编码只需要把你的request的返回值下面的一个参数body传入chardet.detect(html.body)可以输出结果。而这个结果也是一个字典,其中的encoding后面的就是网页的编码。

剩下的一个能扯淡的地方就是try except了,只要有任何语言的编程经验的人对异常处理都不可能完全没听过的。如果你真的没有使用过,那么只有一个可能,你可能没有写过面对用户的真正产品级代码。毕竟,用户大大们在遇到任何问题时是不会有耐心听你解释任何逻辑的。而再次,如果你去掉这个异常处理模块,你会发现,大概率你的爬虫在运行随机时间后,程序就伴着trace back的错误信息就退出了。而爬虫程序绝大概率需要长时间运行,而因为数据巨大,偶尔一两个的数据对于最后的数据分析并没有任何影响。所以,如何在爬虫程序中handle异常是一种哲学,我的哲学就是吞掉这些异常,给出一个默认值,记下log。至于这个commit中为啥没有按照我说的逻辑做,因为我为了能够丰富一下这组文章,我在后面的commit中会涉及。

而就目前来说,说白了,我这个爬虫还只能爬取第一页的信息,总不能永远只看第一页啊,翻页的功能就是为了人类探索更多世界而说明的,而下一个commit,我想做的就是实现理论上的想看多少页就看多少页。

results matching ""

    No results matching ""