之前,我做了一个天猫评论信息的抓取,和评论图片的下载,不过那次是将信息全部存入数据库后再从数据库提取图片信息进行下载,这次我做了一个信息抓取和图片下载的二合一升级版。
本次以京东nike自营店为目标,
链接为:点击打开链接
老方法,按F12打开流量监控器,在network中点击js,接下来在众多条信息中找到储存评论信息的链接,具体如下:
最后找到的链接张这个样子:
https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv119&productId=7252788&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
打开链接后发现它也是json格式的,这就简单啦
首先利用urllib.request打开链接,再用json加载json文件,代码如下:
url='https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv119&productId=7252788&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'
html = urllib.request.urlopen(url).read().decode('gbk')
jsondata = re.search(r'\{.*\}', html).group()
data = json.loads(jsondata)
这里使用了正则是因为html打开发现他是长这样的:
我们需要的json格式文件放在那个()里面。
得到json格式的数据后,就要对数据进行筛选,我将用户名、评论等一些信息放进了数据库中,图片立即下载
首先写一个循环,遍历当前url中的所有评论内容,部分代码如下:
for i in range(0, len(data['comments'])):
id = data['comments'][i]['nickname']
# 用户名
content = data['comments'][i]['content']
# 评论
time = data['comments'][i]['creationTime']
# 评论日期
type = data['comments'][i]['referenceName']
# 型号及颜色
在爬取图片链接并下载时,因为有些评论没有图片,所以需要对key进行判断是否存在
if('images' in data['comments'][i].keys()):
如果存在,则对图片链接进行抓取,并补全链接和下载:
pics = data['comments'][i]['images'][k]['imgUrl']
a='http:'+pics
urllib.request.urlretrieve(a, 'D:\jd_pics/' + str(z)+'_'+str(i+1) + '_' + 'pic' + '_' + str(k) + '.jpg')
# 买家秀,命名规则:第几页第几条评论的第几个图片
对于追评的爬取,大体思路同上,这里不做赘述
最后就是考虑循环抓取,只要写个循环就OK
for j in range(0,150):
url='https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv119&productId=7252788&score=0&sortType=5&page='+str(j)+'&pageSize=10&isShadowSku=0&fold=1'
我这里尝试抓取了前150页评论的内容,因为要一边抓一边下载图片,所以时间较长,我总用时大约25分钟,最后得到数据库中1000条信息
和本地1216张图片
咦~这不对啊,150页每页10条信息,这总数应该是1500啊!为什么我的数据库中只有1000条?
我去百度了下,有前辈这样解释说:
“在mysql中,每个数据库最多可创建20亿个表,一个表允许定义1024列,每行的最大长度为8092字节(不包括文本和图像类型的长度)。
当表中定义有varchar、nvarchar或varbinary类型列时,如果向表中插入的数据行超过8092字节时将导致Transact-SQL语句失败,并产生错误信息。
SQL对每个表中行的数量没有直接限制,但它受数据库存储空间的限制。
每个数据库的最大空间1048516TB,所以一个表可用的最大空间为1048516TB减去数据库类系统表和其它数据库对象所占用的空间。”
也就是说一个数据库的容量是肯定够的,那我剩下的那500条记录哪去了?
找了半天,结果发现navicat for mysql有分页功能,它自动帮我分页了
唉~蠢哭自己
本人学生,对于python爬虫的学习也是刚刚入门,本文及代码如有漏洞,还请各路大神不吝赐教,谢谢!
注:转载请标明出处