【python爬虫2-京东评论爬取】

需求分析

Python网络爬虫基础1
第一篇说明了可以使用Beautiful Soup工具来获取网页内容,然后按照网页分析,选择想要内容的Xpath等地址信息进行提取。但京东网页需要用户登录,涉及的操作比较复杂。本篇使用requests和json库直接爬取京东评论。【前提是得到了json的链接】
需求说明
1.我在京东找到了具体一款的连衣裙,想要看别人的评论来决定是否购买。
2.不仅仅要看评论内容,还要看上身效果图。

目标商品网页如下FANSILANEN范思蓝恩小黑裙
在这里插入图片描述
这个url 是https://item.jd.com/44523080700.html#none
44523080700表示商品的标识productId。
评论网址

“https://club.jd.com/comment/productPageComments.action?&productId={}&score=0&sortType=5&page=0&pageSize={}&isShadowSku=0&fold=1”

  • productId是商品的标识,如上图44523080700是这个连衣裙的标识
  • score为评论的数据类型 如 0全部评价 1好评 2中评 3差评 5追加评价
  • sortType是排序类型(通常使用5)
    因此爬取前两页的商品评论的链接就是:

url = “https://club.jd.com/comment/productPageComments.action?&productId=44523080700&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1”

爬取评论代码实现

由了链接,我们打开发现是一个json,评论链接
在这里插入图片描述

我们想要的是红色文字部分,所有需要解析这个内容。

Python代码实现如下:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :XXXX
@File    :JingDong.py
@IDE     :PyCharm 
@Author  :菜菜2024
@Date    : 
'''
import requests
import json
import time
import pandas as pd
import os

def parseContent(data):
    '''
    从网页数据中解析评论信息
    :param data:
    :return:
    '''
    res=[]
    items = data['comments']

    for i in items:
        try:
            out=[]
            id = i['id']
            creationTime = i['creationTime']
            content = i['content']

            print(id)
            out.append(id)
            out.append(creationTime)
            out.append(content)
            res.append(out)

        except:
            print("没有content")
            pass

    return res

def JingDongComment(save_folder, url):
    '''
     从京东json网页中爬取评论数据
    :param url:
    :return:
    '''
    headers = {
        "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36"
    }
    res =[]
    print(url)

    time.sleep(1)

    try:
        response = requests.get(url=url, headers=headers)
        data = json.loads(response.text)
        # 解析数据
        parsed_data = parseContent(data)
        res.extend(parsed_data)
    except:
        pass

    # 数据写入

    df = pd.DataFrame(res)
    df.to_excel(save_folder, index=False)

    print("------------------保存完成------------------")


if __name__=="__main__":

    save_folder = "./JongDong.xlsx"
    url = "https://club.jd.com/comment/productPageComments.action?&productId=44523080700&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1"
    JingDongComment(save_folder, url)

爬取结果
在这里插入图片描述
想要爬取别的商品和页数只需要替换productId和pageSize。这样也就可以实现批量爬取啦。当然前提是知道多个productId

productId = 44523080700
pageSize = 10
url = "https://club.jd.com/comment/productPageComments.action?&productId={}&score=0&sortType=5&page=0&pageSize={}&isShadowSku=0&fold=1".format(productId, pageSize)

爬取图片链接

由上面的分析,爬取图片链接也比较简单了,只需要解析json的时候取不同的字段就行,将调用parseContent函数改成调用parseImage函数即可,当然你也可以写到一起,同时得到评论和图片链接。


def parseImage(data):
    '''
    从网页数据中解析图片链接
    :param data:
    :return:
    '''
    res=[]
    items = data['comments']

    for i in items:
        try:
            images = i['images']
            for image in images:
                imgurl = image.get("imgUrl")

                print(imgurl)
                res.append(imgurl)

        except:
            print("没有i['images']")
            pass
    return res

结果如图
在这里插入图片描述
复制链接到浏览器就可以打开看到图片了,试试可以发现图片很小,这是因为链接中的s128x96表示图片尺寸是128x96。
可以在excel表中直接替换为s760x500。一个一个太不方面看来,下载下来进行查看

链接下载图片

使用以下函数,注意excel表中的链接以"//“开头,下载的时候需要加上"https:”

def download_img_form_url(excel_path, save_path):
    if not os.path.exists(save_path):
        os.makedirs(save_path)


    df = pd.read_excel(excel_path, sheet_name='Sheet1')

    for index, row in df.iterrows():
        row_data = list(row)
        img_url = "https:"+ row_data[0]
        # 下载图片
        try:
            response = requests.get(img_url, stream=True)
            if response.status_code == 200:

                img_filename = os.path.basename(img_url.rsplit('/', 1)[-1])
                img_path = os.path.join(save_path, img_filename)

                # 写入文件
                with open(img_path, 'wb') as f:
                    for chunk in response.iter_content(1024):
                        f.write(chunk)
                print(f"Downloaded {img_filename} to {save_path}")
            else:
                print(f"Failed to download {img_url}: {response.status_code}")
        except requests.RequestException as e:
            print(f"Error downloading {img_url}: {e}")

尺寸替换之后:

在这里插入图片描述
图片下载:
在这里插入图片描述

总结展望

从json中解析得到评论信息,这里有个前提就是知道json的评论链接。未来方向:

  1. 如果想要批量爬取多个商品评论,不想一个一个找productId,如何脚本获得一类的productId,比如连衣裙销量前十的productId。
  2. 可以看到图片是有水印的
  3. 更多更复杂的爬取需求,京东登录感觉是避免不了的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值