Python数据爬取实例--爬取京东商品评论

一、前言

有了之前爬取淘宝评论的基础,我想如果换个URL和cookie等参数是不是一套一个准,然后就跑去京东测试了一下,结果失败了!因为页面编码不一样所以爬取淘宝所用的正则化提取评论在京东是实现不了的,这个下面会重点介绍。
京东的反爬比淘宝要低一点,所以在利用requests爬取网页内容也可以不用提供那么多参数,可以自己试一下,我还是按照上次的代码提供了URL和headers。

二、代码

因为步骤大部分都一样,所以具体步骤(参考上次的爬取淘宝)就不细讲,直接说不一样的地方!
URL根据具体情况修改,我浏览了多页评论复制其URL后发现,控制页面的是page这个参数,所以我在这里断开!

import pandas as pd
import requests
import time
import json
data_list = []
#爬取的页数为2页,我只是测试能否成功就没爬太多不然浪费时间!参数可以自己设置
for i in range(1,2,1):
    print("正在爬取第" + str(i) + "页")
    #构建访问的网址,这个网址可有讲究了
    first = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100007299145&score=0&sortType=5&page='
    last = '&pageSize=10&isShadowSku=0&rid=d3c43db0985ec379&fold=1'
    url = first + str(i) + last
    #访问的头文件,还带这个cookie
    headers ={
        # 用的哪个浏览器
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
        # 从哪个页面发出的数据申请,每个网站可能略有不同
        'referer': 'https://item.jd.com/100007299145.html',
        # 哪个用户想要看数据,是游客还是注册用户,建议使用登录后的cookie
        'cookie':'__jdu=1680001551; areaId=19; ipLoc-djd=19-1611-19916-0; PCSYCityID=CN_440000_440500_440507; shshshfpb=13d5ace3e0c654e309b2d61e7a07b91fad6982624770bea5f5bb38092c; shshshfpa=4c737b08-3394-a4b3-b659-a18b192fc770-1595515041; jwotest_product=99; pinId=2p6SoycXA0ub7BEMVGWTH7V9-x-f3wj7; pin=jd_74d219351fbde; unick=jd_74d219351fbde; _tp=8GzPfmiGUEaBRGeogBvd4t5TplVxg3zxt8bs3ngcPNY%3D; _pst=jd_74d219351fbde; unpl=V2_ZzNtbUoHQxRzWkQGK0oMAWIFEA5LUEcVfQtAVXpLXAI3C0ANclRCFnQUR1JnGlkUZwQZWEJcQxFFCEdkeBBVAWMDE1VGZxBFLV0CFSNGF1wjU00zQwBBQHcJFF0uSgwDYgcaDhFTQEJ2XBVQL0oMDDdRFAhyZ0AVRQhHZHseVQRmAhJZRldzJXI4dmR8HloGYQQiXHJWc1chVEFVfRtUBSoDFVRDVkIVcQxGZHopXw%3d%3d; TrackID=1wCKdOSD5KrPr8O-8Q8ZNY2qHWWnSFYqFttYCGaghAhCTJfuMXSq-ceKeblveKgrTAtrGxtwa_UKBfYrvn7gjh9rzj-yW_CTZ10IImNCXnDk; thor=009B9D6507BE905BC2DE807BBE72F8B35CD8B73035C26D7A345038B5814CE35B14B95EF514394E6B4FC7B2D50681F82230750F0A77F1DD2C0FDCF18CBE482BE34C35E09F82869EDAEBC523FC3D06AFB9697DD5D757371816CBB38D73638844425A74040FFF3C912B55C1D4F7D7C74B3349C0CB29CA3C28362C3448D41C3FD945FBFA4516199E07C7248688A0AACF46972E0F68ECB17F077A59B635B886B42CFF; ceshi3.com=000; __jdc=122270672; 3AB9D23F7A4B3C9B=AIA2RCPMDF6FLUI63SVRKBPBVA7Y6UOERHJAVC6EH35NTNAVXLPFLY237UYHURSTRA5M2DVSUDOYMUQQSLIRCJ3K6E; shshshfp=614a80530aada68a60a3c02ca77022d6; __jdv=122270672|shouji.jd.com|t_0_|zssc|ac8146d4-d7c0-4654-9cdc-bf07a57877eb-p_128538|1595580177176; __jda=122270672.1680001551.1595515038.1595580074.1595580177.4; shshshsID=bee374abb93f13738426527a23aedafa_5_1595580185627; __jdb=122270672.2.1680001551|4.1595580177; JSESSIONID=5B8E5551DA8CE1D3DE4E93C1C47F32E1.s1'
    }
    #尝试获取数据(这里的数据应该是从json里面获取的)
    try:
        data = requests.get(url,headers = headers).text
        time.sleep(10)
        #print(data)
        '''
        result = re.findall('"content":"(.*?)","creationTime"',data)
        data_list.extend(result)
        '''
        
        #将Str数据改为字典,必须去掉最开头和最结尾后面对应的符号才可以转化为字典!
        jd=json.loads(data.lstrip('fetchJSON_comment98(').rstrip(');'))
        #print(jd)
        #取出用户评论,但是还包含了用户ID等其他信息和奇怪的符号
        com_list=jd['comments']
        #print(com_list)
        #爬取的数据为字典,将评论按键值对取出
        for a in com_list:
            result=a['content']
            #extend逐个添加,这里无论是字符串或者字典,利用extend都会变成一个字一个
            #字的样子,所以要将整句话作为一个整体添加进去!
            data_list.append(result)
            #print(data_list)
    except:
        print("本页爬取失败")

df = pd.DataFrame()
df["评论"] = data_list

df.to_excel("评论_汇总1.xlsx")

代码大体是没变的,里面也都有注释,主要讲一下评论的提取,上次的淘宝是利用正则化来提取,因为将爬取的数据data输出(print)后我们很容易找到规律,评论存在于两个词之间。在爬取京东的商品评论时,我想着是不是只要找到规律依葫芦画瓢就可以无限套娃了(秒啊!)然后print一看

image.png

我发现评论主要在content和vcontent之间,马上复制黏贴按照正则化项一输出,多了好多奇奇怪怪的字符评论也少了几条,重新回去仔细观察后发现在content和vcontent之间的语句不止评论,还包括客服回复等其他东西,而且最重要的是有一些评论不是在这两个词之间!
然后我各种观察,修改正则项通通失败了!最后去网上看大佬们是怎么处理的,看完理解后就得到上面的结果了,下面说一下思路!

首先将爬取的评论用json.loads()转化为字典,当然也不是那么容易转换的,不然上面的代码怎么会有括号里面的那串东西!
我理解好思路后就想转化为字典就好,那不是不用括号内那串代码,果断去掉,一运行,爬取失败!好吧!果然没有一条代码是多余的。
括号里面的代码是去除data(即爬取到的内容)中的最前面和最后面相应的字符串,如果仔细观察print出来data就可以发现(截图并不是完整的data)

image.png

除了开头和结果的符号外,这个看起来就像极了字典的格式,所以只要把开始和结果的多余字符串去除后,就可以转化为字典了!
转化完成后,print输出会发现内容简洁了一些,仔细观察会发现评论都在comments后面,所以我们将其单独取出,再一次print,可以发现内容更为简洁了,离成功也不远了!继续观察,可以发现整体是一个字典,评论都是在content中,准确来说content是一个键,而评论是它的值,我们要的就是这个东西,循环输出就好了!
这里用append来添加是因为如果用extend全部都变成一个字一个字,可以看一下这两个方法的区别!

【注:上面超链接为方法的详细解释】
参考文章:https://www.jb51.net/article/140151.htm
https://www.cnblogs.com/huangbiquan/p/7923008.html
https://www.jianshu.com/p/d4bbb6267e59
https://www.cnblogs.com/mayite/articles/9131501.html

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容