Python爬虫采集京东商品评价

前两期给大家介绍了如何利用requests库爬取小说和图片,这一期就和大家分享一下如何爬取京东商品的评价信息,这里先设置爬取50页,以做日后分析。

一、查找商品并检查网页

打开京东,这里以华为P30手机为例,之后打开开发者模式。
在这里插入图片描述

二、查找评论链接

在网页中找到评论按钮并点击使其加载数据,然后我们点击network查看数据。接着查找加载评论数据的请求url,我们可以复制某条评论中的一段话,然后在调试窗口中(Ctrl+F)调用搜索框进行搜索,可以得到对应的结果:在这里插入图片描述

三、发起requests请求

得到评论数据接口之后,先测试抓取一条数据,成功之后再去分析如何实现批量抓取。

def spider_comment(page=0):
    url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchcomment98&productId=100004404944&' \
              'score=0&sortType=5&page=%s&pageSize=10&isShadowSku=0&fold=1' % page
    try:
        headers = {
            "referer": "https://item.jd.com/100004404944.html",
            "user - agent": "Mozilla / 5.0"
        }
        r = requests.get(url, headers=headers)
        r.raise_for_status()
    except:
        print("error") 

四、数据的提取

点击查找后得到的结果,可以得到一组字符串,这便就是我们想要得到的结果。当然,此数据为jsonp跨域请求返回的json结果,所以我们只要把前面的’ fetchJSON_comment98( '和最后的 ’ ) ’ 去掉就可以得到json数据了,因为每个商品的编号可能不同,所以这里不做统一。json以键值对的形式保存,其中有一个名称为comments的key里面存放这我们想要的评论数据。再对comments值进行分析发现它包含了评论的内容,时间,id等信息,我们想要得到的评价内容则隐藏在content字段中。
在这里插入图片描述

 # 去除前后无用字符
json_str = r.text[15:-2]
# 将json转换为python对象
json_obj = json.loads(json_str)
# 获取评价列表
comments = json_obj['comments']
# 可以用for循环打印出所有评论
for comment in comments:
    print(comment['content']+'\n') 

五、数据存储

将采集的数据信息以txt格式保存(这里提前创建好txt文件,只需循环写入即可)。

for comment in comments:
    with open('E:/python/resource/comments.txt', 'a+') as f:
        f.write(comment['content'])
        f.write('\n') 

六、实现翻页

完成第一页数据采集之后,来研究一下如何批量采集?让我们看一看第一页评论数据的url:

https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100004404944&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&rid=0&fold=1

可以看到链接里面有两个参数 page=0&pageSize=10,page表示当前的页数,pageSize表示每页多少条,所以使这里的数字发生改变就可以实现翻页的功能。了解了翻页的原理后,那我们就开始实现它吧。首先,找到第二页按钮并点击,然后复制第一条评价去调试窗口搜索(方法同上),然后点击Headers查看第二页请求数据的url:

https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100004404944&score=0&sortType=5&page=1&pageSize=10&isShadowSku=0&rid=0&fold=1

通过比较第一页评价与第二页评价的url的区别,可以看出第一页page=0,第二页page=1,以此类推。所以只要在每次请求时将page参数递增就可以实现翻页了,这里可以利用迭代器来实现,(对spider_comment方法增加入参page:页数,然后在url中增加占位符,这样就可以动态修改url,爬取指定的页数)。我们来看一下代码:

def change_page():
    for i in range(50):
        spider_comment(i)
        time.sleep(random.random() * 5)
    print("ok") 

注:在for循环中设置了一个随机的休眠时间,用来模拟用户浏览,防止爬取太频繁被封ip

下面是采集情况:
在这里插入图片描述

附源代码:

# coding='utf-8'
import requests
import json
import time
import random
import jieba


headers = {
        "referer": "https://item.jd.com/100004404944.html",
        "user - agent": "Mozilla / 5.0"
    }

def spider_comment(page=0):
    url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchcomment98&productId=100004404944&' \
          'score=0&sortType=5&page=%s&pageSize=10&isShadowSku=0&fold=1' % page
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
    except:
        print("error")
    # 获取json字符串
    json_str = r.text[15:-2]
    # 将json转换为python对象
    json_obj = json.loads(json_str)
    # 获取评价列表
    comments = json_obj['comments']
    # 遍历列表并写入
    for comment in comments:
        with open('E:/python/resource/comments.txt', 'a+') as f:
            f.write(comment['content'])
            f.write('\n')

def change_page():
    for i in range(2):
        spider_comment(i)
        time.sleep(random.random() * 5)
    print("ok")

if __name__ == '__main__':
    # spider_comment()
    change_page() 

如有错误,欢迎私信纠正,谢谢支持!

posted @ 2022-11-16 18:06  杨业壮  阅读(1539)  评论(0编辑  收藏  举报