充气娃娃什么感觉?

ps:本文参考“裸睡的猪”公众号。

 本文中所用的到第三方库有:

requests   jieba   numpy    Pillow    wordcloud    matplotlib

前言:

基于很多人没有体验过充气娃娃是什么感觉,但是又很好奇,所以希望通过爬虫+数据分析的方式直观而真实的告诉大家(下图为成品图)

一、技术方案

1、分析狗东评论数据的请求url

2、使用requests库来抓取评论内容

3、使用词云做数据展示

二、技术实现

1、分析并获取商品评论的接口

第一步:打开狗东的商品页,搜索你想研究的商品。我们这里直接搜索“充气娃娃”,然后进入第一个店铺。

第二步:我们在页面中鼠标右键选择检查(或F12)调出浏览器的调试窗口。

第三步:调出浏览器后点击评论按钮使其加载数据,然后我们点击network查看数据。

第四部:点击Headers,获取评论的接口

经过上面的步骤,我们就轻松的获取到了评论的请求接口。

2、爬取数据

拿到评论数据接口url之后,我们就可以开始写代码抓取数据了。一般我们会先尝试抓取一条数据,成功之后,我们再去分析如何实现大量抓取。

import requests

def spider_comment():
    """爬取狗东评论数据"""
    kv = {‘Referer‘: ‘https://item.jd.com/1070129528.html‘,
          ‘Sec-Fetch-Mode‘: ‘no-cors‘,
          ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36‘}

    url = ‘https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv9087&productId=1070129528&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1‘
    try:
        result = requests.get(url, headers=kv)
        result.raise_for_status()  # 返回状态码。如果返回4XX或者5XX直接执行except
        print(result.text)
    except Exception as e:
        print(e)

if __name__ == ‘__main__‘:
    spider_comment()

获取到如图数据:

3、数据提取

我们对爬取的数据分析发现,此数据为jsonp跨域请求返回的json结果,所以我们只要把前面的fetchJSON_comment98vv9087(和最后的)去掉就拿到json数据了。

将json数据复制到json格式化工具中或者在Chrome浏览器调试窗口点击Preview也可以看到,json数据中有一个key为comments的值便是我们想要的评论数据。

我们再对comments值进行分析发现是一个有多条数据的列表,而列表里的每一项就是每个评论对象,包含了评论的内容,时间,id,评价来源等等信息,而其中的content字段便是我们在页面看到的用户评价内容。

import json

import requests

def spider_comment():
    """爬取狗东评论数据"""
    kv = {‘Referer‘: ‘https://item.jd.com/1070129528.html‘,
          ‘Sec-Fetch-Mode‘: ‘no-cors‘,
          ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36‘}

    url = ‘https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv9087&productId=1070129528&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1‘
    try:
        result = requests.get(url, headers=kv)
        result.raise_for_status()
        result_json_str = result.text[26:-2]  # json字符串
        result_dict = json.loads(result_json_str)  # 将json转换为字典
        result_json_comments = result_dict[‘comments‘]  # 经过分析,发现评论都在‘comments‘,返回列表套字典
        for i in result_json_comments:  # 真正的评论在‘content
            print(i[‘content‘])
    except Exception as e:
        print(e)

if __name__ == ‘__main__‘:
    spider_comment()

4.数据保存

数据提取后我们需要将他们保存起来,一般保存数据的格式主要有:文件、数据库、内存这三大类。今天我们就将数据保存为txt文件格式,因为操作文件相对简单同时也能满足我们的后续数据分析的需求。

import jsonimport osimport randomimport time

import requests

comment_file_path = ‘jd_comment.txt‘

def spider_comment():    """爬取狗东评论数据"""    kv = {‘Referer‘: ‘https://item.jd.com/1070129528.html‘,          ‘Sec-Fetch-Mode‘: ‘no-cors‘,          ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36‘}

    url = ‘https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv9086&productId=1070129528&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1‘    try:        result = requests.get(url, headers=kv)        result.raise_for_status()        result_json_str = result.text[26:-2]  # json字符串        result_dict = json.loads(result_json_str)  # 将json转换为字典        result_json_comments = result_dict[‘comments‘]   # 经过分析,发现评论都在‘comments‘,返回列表套字典        for i in result_json_comments:  # 真正的评论在‘content‘            with open(comment_file_path, ‘a+‘, encoding=‘utf-8‘) as f:                f.write(i[‘content‘] + ‘\n‘)    except Exception as e:        print(e)

if __name__ == ‘__main__‘:
spider_comment()

5.批量爬取

我们刚刚完成一页数据爬取、提取、保存之后,我们来研究一下如何批量抓取?

做过web的同学可能知道,有一项功能是我们必须要做的,那便是分页。何为分页?为何要做分页?

我们在浏览很多网页的时候常常看到“下一页”这样的字眼,其实这就是使用了分页技术,因为向用户展示数据时不可能把所有的数据一次性展示,所以采用分页技术,一页一页的展示出来。

让我们再回到最开始的加载评论数据的url:

https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv9087&productId=1070129528&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1

我们可以看到链接里面有两个参数page=0&pageSize=10,page表示当前的页数,pageSize表示每页多少条,那这两个数据直接去数据库limit数据。

老司机一眼便可以看出这就是分页的参数,但是有同学会说:如果我是老司机还干嘛看你的文章?所以我教大家如何来找到这个分页参数

回到某东的商品页,我们将评价页面拉到最底下,发现有分页的按钮,然后我们在调试窗口清空之前的请求记录。

清空之前的请求记录之后,我们点击上图红框分页按钮的数字2,代表这第二页,然后复制第一条评价去调试窗口搜索,最后找到请求链接。

和上面的步骤一样。

然后我们比较第一页评价与第二页评价的url有何区别,可以很容易发下只有page不同。

这里也就验证了猜想:page表示当前的页数,pageSize表示每页多少条。而且我们还能得出另一个结论:第一个page=0,第二页page=1 然后依次往后。有同学会问:为什么第一页不是1,而是0,因为在数据库中一般的都是从0开始计数,编程行业很多数组列表都是从0开始计数。

好了,知道分页规律之后,我们只要在每次请求时将page参数递增不就可以批量抓取了吗?我们来写代码吧!

import json
import os
import random
import time

import requests

comment_file_path = ‘jd_comment.txt‘

def spider_comment(page):
    """爬取狗东评论数据"""
    kv = {‘Referer‘: ‘https://item.jd.com/1070129528.html‘,
          ‘Sec-Fetch-Mode‘: ‘no-cors‘,
          ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36‘}

    url = ‘https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv9086&productId=1070129528&score=0&sortType=5&page=%s&pageSize=10&isShadowSku=0&fold=1‘ % page
    try:
        result = requests.get(url, headers=kv)
        result.raise_for_status()
        result_json_str = result.text[26:-2]  # json字符串
        result_dict = json.loads(result_json_str)  # 将json转换为字典
        result_json_comments = result_dict[‘comments‘]   # 经过分析,发现评论都在‘comments‘,返回列表套字典
        for i in result_json_comments:  # 真正的评论在‘content‘
            with open(comment_file_path, ‘a+‘, encoding=‘utf-8‘) as f:
                f.write(i[‘content‘] + ‘\n‘)
    except Exception as e:
        print(e)

def batch_spider_comment():
    # 写入文件之前,先清空之前的数据
    if os.path.exists(comment_file_path):
        os.remove(comment_file_path)
    for i in range(100):
        spider_comment(i)
        # 模拟用户浏览,设置一个爬虫间隔,防止ip被封
        time.sleep(random.random() * 5)

if __name__ == ‘__main__‘:
    batch_spider_comment()

6.数据清洗以及生成词云。

数据成功保存之后我们需要对数据进行分词清洗,对于分词我们使用著名的分词库jieba

import jieba
import numpy as np
from PIL import Image
from wordcloud import WordCloud
import matplotlib.pyplot as plt

comment_file_path = ‘jd_comment.txt‘

def cut_word():
    ‘‘‘
    对数据分词
    :return: 分词后的数据
    ‘‘‘
    with open(comment_file_path, ‘r‘, encoding=‘utf-8‘) as f:
        comment_txt = f.read()

        wordlist = jieba.cut(comment_txt, cut_all=True)
        word_str = ‘ ‘.join(wordlist)
        #print(word_str)
        return word_str

def create_word_cloud():
    """生成词云"""
    # 设置词云形状图片
    coloring = np.array(Image.open(‘wawa.jpg‘))
    # 设置词云一些配置,如字体,背景色,词云形状,大小
    wc = WordCloud(background_color=‘white‘, max_words=2000,mask=coloring, scale=4,
                   max_font_size=50, random_state=42, font_path=‘C:\Windows\Fonts\msyhbd.ttc‘)
    # 生成词云
    wc.generate(cut_word())

    # 在只设置mask情况下,会拥有一个图形形状的词云
    plt.imshow(wc, interpolation="bilinear")
    plt.axis(‘off‘)
    plt.figure()
    plt.show()

if __name__ == ‘__main__‘:
    create_word_cloud()

注意:font_path是选择字体的路径,如果不设置默认字体可能不支持中文,猪哥选择的是Mac系统自带的宋体字!

最终结果:

原文地址:https://www.cnblogs.com/huiyichanmian/p/11581980.html

时间: 2024-08-02 17:49:12

充气娃娃什么感觉?的相关文章

充气娃娃?Python告诉你到底有多爽......

上某东的时候,突然给我弹了一个充气娃娃的广告,于是就点进去就看了一下评论,全是神评论啊.所以我就想着把大神们的评论们扒拉下来仔细瞅瞅,于是这篇文章就诞生了??,纯属学习啊,不要想入非非啊,还有,不喜勿喷! 按照软件设计流程来: 需求分析-功能描述-技术文档-详细设计-编码-测试-交付-验收-后期维护 1.需求分析: 首先我先找了某东最火娃娃,里面评论近乎7万条,这里面神评论一定不少.所以决定从这个里面扒拉我们想要获取的数据 2.功能描述 充气娃娃这种东西,一般大家都在网上见得多,所以玩起来到底感

推荐一篇关于java 学习的文章,感觉写的很不错

---恢复内容开始---    很多网友问我学习Java有没有什么捷径,我说"无他,唯手熟尔".但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛!     要想学好Java,首先要知道Java的大致分类.我们知道,自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三块:J2SE,J2ME和J2EE, 这也就是SunONE(OpenNetEnvironment)体系.J2SE就是Java2的标准版,主要用于桌面应

获“领跑衫”感觉

小组名称:天天向上 项目名称:连连看 小组成员: 王森.张金生.张政.胡丽娜.林莉 此次在final发布阶段小组排名第二,很荣幸能够得到"领跑衫".这件小衫是我们组成员努力的结果,同时也是对我们工作的一种肯定.一学期眨眼即逝,回想起来,还是有很多丰富的记忆,酸甜苦辣应有尽有.感谢张政.张金生同学,不辞辛苦经常编代码到深夜,感谢林莉.胡丽娜同学为项目出谋划策.完成测试工作以及常常帮我博客占坑.虽然这个学期作业多,感觉累,但是我们组成员都获得很大成长,这不仅靠的我们自身的努力,还有各位老师

感觉自己好不努力啊。

一口心气儿没提上来的感觉,不如以前努力了,成天就想着给自己找理由,三四个月过去了,整个人竟然还是这副样子,也是没谁了. 狂扇自己两巴掌,就当是也连带着把Ubuntu收拾了一顿吧. 加油啊,小伙子. 今晚一定要把左侧的下拉列表做完.

转载 intellij IDEA 使用体验 (本人感觉它的使用是一种趋势)

从去年开始转java以来,一直在寻找一款趁手的兵器,eclipse虽然是很多java程序员的首选,但是我发现一旦安装了一些插件,workspace中的项目达到数10个以后,经常崩溃,实在影响编程的心情. 今天试用了近年获得众多好评的IntelliJ IDEA 13,感觉焕然一新,记录如下: 一.下载安装 http://www.jetbrains.com/idea/download/ 这是官网的下载地址,支持mac/windows/linux三大主流平台,我今天试用的是mac版本 说明:Intel

《日常神经科学》神经科学的很大一个目标,就是让文艺和浪漫的事,变得不文艺不浪漫(因为给出了人感觉到文艺和浪漫的科学的解释)。三星推荐

不错的神经科学的科普.作者是英国神经科学在读博士.文笔比较幽默.大部分的内容都说的比较有趣. 以下是书中一些内容的摘抄: 神经科学的很大一个目标,就是让文艺和浪漫的事,变得不文艺不浪漫(因为给出了人感觉到文艺和浪漫的科学的解释): 这是谎言:正常人的大脑只开发了10%: 一条裙子的颜色(白金.蓝黑)引发的全球口水战,原因在于:对于所见之物,我们每时每刻都在脑补: 人的听力随年龄增长逐渐下降.到了35岁,已经明显听不到许多高频声音了.有个英国大叔讨厌在他家门口玩的小孩,就做了一个会发出高频声音的音

突然间,对JAVA也找到点感觉了。

书上没有那段代码,我自己修修补补弄完全了呢.... 就是感觉体系有点宏大,不要急,慢慢玩~!~~ 这个世界很精彩哟~~: QuizCard.java package QuizCard.sky.com; public class QuizCard { private String qStr; private String aStr; QuizCard (String s1, String s2) { qStr = s1; aStr = s2; } String getQuestion() { re

比较喜欢编程,也比较努力的学习,呵呵,感觉挺好

我呢,感觉自己是一个性格热情开朗的人,待人友好,为人诚实谦虚.在校期间曾担任过学生会宣传部部长,策划组织过校级活动,有较强的组织能力和领导能力,课余时间学习过Java.Photoshop.SolidWorks等软件,熟悉使用微软的办公软件,具有较强的学习能力.大学期间对做实验很感兴趣,在实验过程中能够发现一些新的现象,并且可以在实验数据中得到规律.结论.结果等重要信息.能够独自以及团队合作完成所做实验,相信自己的能力和团队协作能力. 一个信息化部门 工作职责:1.整个华北地区空军光通信网络和指挥

Java的Reference感觉很象C++的指针,但是区别是本质的

他们相同之处在于都是含有一个地址,但是在Java中你无法对这个地址进行任何数学运算,并且这个地址你不知道,是Java Runtime分配给你的,它随时还要调整这个地址(After GC,Memory要Compact,这时候一个Object Reference的地址就会改变). 而C/C++之中,你可以对指针变量进行各种操作.譬如下面这个小例子 #include <iostream.h>int main (){int numbers[5];int * p;p = numbers; *p = 10