天猫爬虫--爬取天猫评论中的图片
毕业设计做的是基于电商的评论图片爬取,本次以天猫NIKE网店为爬取对象,
链接为:点击打开链接
首先按F12打开火狐浏览器的流量监控工具,点击网络,然后依次点击累计评论、图片,显示含有图片的评论,经过艰辛查找,最后发现评论内容存放在类型为html,
https://rate.tmall.com/list_detail_rate.htm?itemId=560632678223&spuId=894371803&sellerId=890482188&order=3¤tPage=1&append=0&content=1&tagId=&posi=&picture=1&ua=098%23E1hv3vvbvPUvUvCkvvvvvjiPPss9tjDRPLqOzj1VPmPw1jDnRLSZAjDvR2SwljEvRphvCvvvvvm5vpvhvvmv99GCvvpvvPMMKphv8vvvvvCvpvvvvvvCNyCvmUOvvUUdphvWvvvv9krvpvQvvvmm86Cv2vmEvpvVmvvC9jXCuphvmvvv92UQORKfmphvLv1T89vjOezhsjZ7%2B3%2Butj7gQfut8vmxfwLZdiB%2Bm7zhlj7JecnOD7zhQ8g7EcqhQjc6%2Bul1B57OD70Oe361D7zht8gcWhcnI4mxdX9CvpvVvvpvvhCvRphvCvvvvvmjvpvhvvpvvUhCvmig7TbMur147Di3mrGD1TAqsd%2FoU0diu%2BRYsIndkv8PFOuoI75mvIApyUG%3D&isg=BKSkHuFqoyir-NZCcbH79TAIdaJWlcnPNpZBrr7Fp28paUAz5k2YN9rbLYFUsQD_&itemPropertyId=&itemPropertyIndex=&userPropertyId=&userPropertyIndex=&rateQuery=&location=&needFold=0&_ksTS=1530892714671_987&callback=jsonp988
这样的链接里,
分析链接后,我们爬取所用的最终链接为:
https://rate.tmall.com/list_detail_rate.htm?itemId=560632678223&sellerId=890482188&picture=1¤tPage=1
其中itemId为商品ID,sellerId为卖家ID,picture=1表示有图片的评论,删除&picture=1就可以爬取所有的评论,currentId为当前页号,它等于1得到的是评论的第一页,借此我们可以做到循环爬取。
打开上述链接,发现它是json格式的,如果不加处理会是一串很让人头疼的字符串,我这里使用了一个叫做JSON-handle的浏览器插件,它可以将json文件自动排版,帮助我们分析。
效果如图:
ok,分析完毕接下来进入正题。
首先,我们需要获取和加载json文件
import urllib.request import json import re html = urllib.request.urlopen(url).read().decode('gbk') jsondata = re.search(r'{(.*)', html).group() data = json.loads(jsondata)由于使用了精简的url,所以得到的html不是完整的json格式,所以用正则修改下。
获得了data后,我们对需要的信息进行保存:
num = len(data['rateList']) #获取当前页总评论数 for i in range(0,num):id = data['rateList'][i]['displayUserNick']#用户名content = data['rateList'][i]['rateContent']#评论time = data['rateList'][i]['rateDate']# 评论日期type = data['rateList'][i]['auctionSku']#型号及颜色pics=data['rateList'][i]['pics']#买家秀if(data['rateList'][i]['appendComment']==''): #判断是否有追评,如果没有将追评的信息默认为空appenddays=''appendtime=''appendcontent=''appendpics=''else:appenddays = data['rateList'][i]['appendComment']['days']#追加评论的间隔天数appendtime=data['rateList'][i]['appendComment']['commentTime']#追加评论的时间appendcontent=data['rateList'][i]['appendComment']['content']#追加评论的内容appendpics=data['rateList'][i]['appendComment']['pics']#追加评论的内容如上代码,考虑到存在有些买家有追评,有些没有,而没有的数据中 data['rateList'][i]['appendComment'] 所对应的values是空的,如果不加判断后面保存追加信息时会报错。
接下来考虑循环爬取,其实只要将url循环变更就好
for j in range(1,100):url='https://rate.tmall.com/list_detail_rate.htm?itemId=560632678223&sellerId=890482188¤tPage='+str(j)print('开始爬取第'+str(j)+'页')pagenum = data["paginator"]["lastPage"]if(j>=pagenum):break经过分析,发现data["paginator"]["lastPage"]中存放着评论总页数,我们在循环中加个判断,当我们爬取的当前页码大于或等于总页数时跳出循环,终止爬取。
考虑到数据的存储,我使用了mysql这个数据库,最后对代码进行面向对象的重新编写,最终代码为:
import urllib.request import pymysql import re import time import json#链接数据库 def connect_db():conn = pymysql.connect(host="localhost", user="root", password="1409", port=3306, db="tmall", charset="utf8")return conn#关闭数据库 def close_db(cursor, conn):cursor.close()conn.close()#获取json数据 def getdata(url):html = urllib.request.urlopen(url).read().decode('gbk')jsondata = re.search(r'{(.*)', html).group()data = json.loads(jsondata)return data#获取当前页总评论数 def getnum(data):num = len(data['rateList'])return num#获取总共有多少页评论 def getpagenum(data):pagenum = data["paginator"]["lastPage"]return pagenum#抓取内容并放入数据库中 def sql(data,num):conn = connect_db()cursor = conn.cursor()for i in range(0,num):id = data['rateList'][i]['displayUserNick']#用户名content = data['rateList'][i]['rateContent']#评论time = data['rateList'][i]['rateDate']# 评论日期type = data['rateList'][i]['auctionSku']#型号及颜色pics=data['rateList'][i]['pics']#买家秀if(data['rateList'][i]['appendComment']==''): #判断是否有追评,如果没有将追评的信息默认为空appenddays=''appendtime=''appendcontent=''appendpics=''else:appenddays = data['rateList'][i]['appendComment']['days']#追加评论的间隔天数appendtime=data['rateList'][i]['appendComment']['commentTime']#追加评论的时间appendcontent=data['rateList'][i]['appendComment']['content']#追加评论的内容appendpics=data['rateList'][i]['appendComment']['pics']#追加评论的内容sql = 'insert into nikeshoes(id,content,time,type,pics,appenddays,appendtime,appendcontent,appendpics) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)'params = (str(id),str(content),str(time),str(type),str(pics),str(appenddays),str(appendtime),str(appendcontent),str(appendpics))cursor.execute(sql, params)conn.commit()print(str(i) + "页数据已经保存")close_db(cursor, conn)#主程序 #从第一页开始,当抓取的页数等于总评论页数时终止循环 def main():for j in range(1,100):url='https://rate.tmall.com/list_detail_rate.htm?itemId=560632678223&sellerId=890482188¤tPage='+str(j)print('开始爬取第'+str(j)+'页')data = getdata(url)num = getnum(data)pagenum = getpagenum(data)sql(data, num)if(j>=pagenum):breaktime.sleep(3)if __name__ == '__main__':main()本以为大功告成了,结果天猫的反爬还是厉害的,我才爬到第5页就被拦下来了
最终也没爬下来多少内容,不过我发现这个反爬其实也就拦那一下,你重新运行以下也就好了,不过记得把开始爬取的页号改为你刚才被拦下的页号就好了。
经过辛勤的手工劳动,完成了共1000条信息的爬取
本人学生,对于python爬虫的学习也是刚刚入门,本文及代码如有漏洞,还请各路大神不吝赐教,谢谢!
注:转载请标明出处!
总结
以上是生活随笔为你收集整理的天猫爬虫--爬取天猫评论中的图片的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: JSP打印九九乘法表和表格
- 下一篇: Acrobat如何将word文件转换成p