欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典)

程序员文章站 2023-10-31 14:29:40
在学习python的时候,一定会遇到网站内容是通过 ajax动态请求、异步刷新生成的json数据 的情况,并且通过python使用之前爬取静态网页内容的方式是不可以实现的,...

在学习python的时候,一定会遇到网站内容是通过 ajax动态请求、异步刷新生成的json数据 的情况,并且通过python使用之前爬取静态网页内容的方式是不可以实现的,所以这篇文章将要讲述如果在python中爬取ajax动态生成的数据。

至于读取静态网页内容的方式,有兴趣的可以查看本文内容。

这里我们以爬取淘宝评论为例子讲解一下如何去做到的。

这里主要分为了四步:

一 获取淘宝评论时,ajax请求链接(url)

二 获取该ajax请求返回的json数据

三 使用python解析json数据

四 保存解析的结果

步骤一:

获取淘宝评论时,ajax请求链接(url)这里我使用的是chrome浏览器来完成的。打开淘宝链接,在搜索框中搜索一个商品,比如“鞋子”,这里我们选择第一项商品。

通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典) 

然后跳转到了一个新的网页中。在这里由于我们需要爬取用户的评论,所以我们点击累计评价。

通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典) 

然后我们就可以看到用户对该商品的评价了,这时我们在网页中右击选择审查元素(或者直接使用f12打开)并且选中network选项,如图所示:

通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典) 

我们在用户评论中,翻到底部 点击下一页或者第二页,我们在network中看到动态添加了几项,我们选择开头为list_detail_rate.htm?itemid=35648967399的一项。

通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典) 

然后点击该选项,我们可以在右边选项框中看到有关该链接的信息,我们要复制request url中的链接内容。

通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典) 

我们在浏览器的地址栏中输入刚才我们获得url链接,打开后我们会发现页面返回的是我们所需要的数据,不过显得很乱,因为这是json数据。

通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典) 

二 获取该ajax请求返回的json数据

下一步,我们就要获取url中的json数据了。我所使用的python编辑器是pycharm,下面看一下python代码:

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
url='https://rate.tmall.com/list_detail_rate.htm?itemid=35648967399&spuid=226460655&sellerid=1809124267ℴ=3&currentpage=1&append=0&content=1&tagid=&posi=&picture=&ua=011uw5tcymnyqwiaiwqrhhbfef8qxthcklnmwc%3d%7cum5ocktyt3zcf0b9qn9gec4%3d%7cu2xmhdj7g2ahyg8has8wkaymcfq1uz9yjlxyjhi%3d%7cvghxd1llxgvyyvvov2pvaffvwgvhe0z%2frhfmeub4qhxcdkh8sxjccg%3d%3d%7cvwldfs0rmq47asedjwcpsddnpm4lnba7rijldxijzbk3ytc%3d%7cvmhigcufobgkgimxnwswczalkxcpeikjmwg9hsefjb8%2fbtopwq8%3d%7cv29phzefp29vbfz2snbkdiaapr0zht0boqi8a1ud%7cwgfbet8rmqszdy8qlxuudjijnqa1yzu%3d%7cwwbaed4qmau%2baseylbksddaeoga1yzu%3d%7cwmjcejwsmmjxb1d3t3jmc1nmwgjaefhmw2jcfezmwgw6gichkqcngcudibpmgg%3d%3d%7cw2jfykj%2fx2bafev5wwdfzuv8xgbudebgvxvjciq%3d&isg=82b6a3a1ed52a6996bca2111c9daaee6&_ksts=1440490222698_2142&callback=jsonp2143' #这里的url比较长
content=requests.get(url).content

print content #打印出来的内容就是我们之前在网页中获取到的json数据。包括用户的评论。

这里的content就是我们所需要的json数据,下一步就需要我们解析这些个json数据了。

三 使用python解析json数据

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
import json
import re
url='https://rate.tmall.com/list_detail_rate.htm?itemid=35648967399&spuid=226460655&sellerid=1809124267ℴ=3&currentpage=1&append=0&content=1&tagid=&posi=&picture=&ua=011uw5tcymnyqwiaiwqrhhbfef8qxthcklnmwc%3d%7cum5ocktyt3zcf0b9qn9gec4%3d%7cu2xmhdj7g2ahyg8has8wkaymcfq1uz9yjlxyjhi%3d%7cvghxd1llxgvyyvvov2pvaffvwgvhe0z%2frhfmeub4qhxcdkh8sxjccg%3d%3d%7cvwldfs0rmq47asedjwcpsddnpm4lnba7rijldxijzbk3ytc%3d%7cvmhigcufobgkgimxnwswczalkxcpeikjmwg9hsefjb8%2fbtopwq8%3d%7cv29phzefp29vbfz2snbkdiaapr0zht0boqi8a1ud%7cwgfbet8rmqszdy8qlxuudjijnqa1yzu%3d%7cwwbaed4qmau%2baseylbksddaeoga1yzu%3d%7cwmjcejwsmmjxb1d3t3jmc1nmwgjaefhmw2jcfezmwgw6gichkqcngcudibpmgg%3d%3d%7cw2jfykj%2fx2bafev5wwdfzuv8xgbudebgvxvjciq%3d&isg=82b6a3a1ed52a6996bca2111c9daaee6&_ksts=1440490222698_2142&callback=jsonp2143'
cont=requests.get(url).content
rex=re.compile(r'\w+[(]{1}(.*)[)]{1}')
content=rex.findall(cont)[0]
con=json.loads(content,"gbk")
count=len(con['ratedetail']['ratelist'])
for i in xrange(count):
  print con['ratedetail']['ratelist'][i]['appendcomment']['content']

通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典)  

解析:

这里需要导入所要的包,re为正则表达式需要的包,解析json数据需要import json

cont=requests.get(url).content #获取网页中json数据

rex=re.compile(r'\w+[(]{1}(.*)[)]{1}') #正则表达式去除cont数据中多余的部分,是数据成为真正的json格式的数据{“a”:”b”,”c”:”d”}

con=json.loads(content,”gbk”) 使用json的loads函数 将content内容转化为json库函数可以处理的数据格式,”gbk”为数据的编码方式,由于win系统默认为gbk

count=len(con[‘ratedetail'][‘ratelist']) #获取用户评论的个数(这里只是当前页的)

for i in xrange(count):

print con[‘ratedetail'][‘ratelist'][i][‘appendcomment']

#循环遍历用户的评论 并输出(也可以根据需求保存数据,可以查看第四部分)

这里的难点是在杂乱的json数据中查找用户评论的路径

四 保存解析的结果

这里用户可以将用户的评论信息保存到本地,如保存为csv格式。

以上就是本文的全部所述,希望大家喜欢。