我们常常看到一些有关充气娃娃的表情包和图片或新闻,但是这种东西很少会像一些小视频一些相互交流,大家可能都是偷摸玩耍。所以猪哥相信其实大部分同学并没有亲身体验过充气娃娃到底是什么感觉(包括猪哥),所以猪哥很好奇究竟是什么一种体验?真的如传言中那样爽吗?
功能描述
基于很多人没有体验过充气娃娃是什么感觉,但是又很好奇,所以希望通过爬虫+数据分析的方式直观而真实的告诉大家(下图为成品图)。
技术方案
为了实现上面的需求以及功能,我们来讨论下具体的技术实现方案:
- 分析某东评论数据请求
- 使用requests库抓取某东的充气娃娃评论
- 使用词云做数据展示
技术实现
上以某东商品编号为:1263013576的商品为对象,进行数据分析,我们来看看详细的技术实现步骤吧!
1.分析并获取评论接口的URL
第一步:打开某东的商品页,搜索你想研究的商品。
第二步:我们在页面中鼠标右键选择检查(或F12)调出浏览器的调试窗口。
第三步:调出浏览器后点击评论按钮使其加载数据,然后我们点击network查看数据。
第四步:查找加载评论数据的请求url,我们可以使用某条评论中的一段话,然后在调试窗口中搜索。
经过这几步, 我们就拿到了商品评论的接口
https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv5584&productId=1263013576&score=0&sortType=5&page=1&pageSize=10&isShadowSku=0&fold=1
2.爬取评论数据
拿到评论数据接口url之后,我们就可以开始写代码抓取数据了。一般我们会先尝试抓取一条数据,成功之后,我们再去分析如何实现大量抓取。
两个请求头Referer和User-Agent,那我们先把他们加到代码的请求头中,
3.数据提取
接着,解析数据,由于拿到的是一个字符串,并且是有规则的,如下
我们可以将获取的信息读取并切片,并将json数据转换为dict, 发现我们要的数据在comments中的content中,然后打开文件写入
5.批量爬取
我们这里就使用多线程来批量爬取,批量方式可以自行选择
** 要找到规律:每次url中的page数字就代表的是第几页, 那么我们可以使用range,格式化输出url **
6.数据清洗
数据成功保存之后我们需要对数据进行分词清洗,对于分词我们使用著名的分词库jieba。
7.生成词云
生成词云我们需要用到numpy、matplotlib、wordcloud、Pillow这几个库,大家先自行下载。matplotlib库用于图像处理,wordcloud库用于生成词云。
最终结果:
附录
需要安装的包:
pip install requests # 爬虫模块
pip install jieba # 分词
pip install wordcloud # 词云
pip install numpy # 数据处理
pip install matplotlib # 图像绘制
pip install Pillow # 图片处理
全代码
import requests
import json
import os
import jieba
import threading
import time
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import wordcloud
def main():
# url2 = """https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv5584&productId=1263013576&score=0&sortType=5&page=1&pageSize=10&isShadowSku=0&fold=1"""
# parse(url2)
url_list = []
# 遍历100页
for i in range(1, 100):
url = "https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv5584&productId=1263013576&score=0&sortType=5&page=%s&pageSize=10&isShadowSku=0&fold=1" % i
# 加入子线程
t1 = threading.Thread(target=parse, args=(url,))
# 开启子线程
t1.start()
# parse(url)
def parse(url):
# print(url)
# headers 反爬虫,referer 跳转来自哪个网页
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://item.jd.com/1263013576.html"
}
time.sleep(2)
# 代理ip,已过期,请自行百度
proxies = {
"http": "http://117.90.5.25:9000"
}
# request.get(url, proxies=proxies)
response = requests.get(url, headers=headers, proxies=proxies)
print(response)
ret = response.text[26:-2]
json_str = json.loads(ret)
data1 = json_str["comments"]
with open("content.txt", "a")as f:
for temp in data1:
data = temp["content"]
print(temp)
f.write(data+'\n')
def cut_word():
with open("content.txt", 'r') as f:
data = f.read()
wordlist = jieba.cut(data, cut_all=True)
# print(wordlist)
wl = " ".join(wordlist)
return wl
def create_wordcloud():
coloring = np.array(Image.open("wawa.jpeg")) # 这里的wawa.jpeg 自行找个图片就行,将会按照图片的形状绘图
# 设置词云的配置,字体,背景色,词云形状,大小
wc = wordcloud.WordCloud(background_color="white", max_words=2000, mask=coloring, scale=4, max_font_size=50, random_state=42, font_path="/Library/Fonts/Songti.ttc")
# 生成词云
wc.generate(cut_word())
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.figure()
plt.show()
# print(ret.decode("GBK"))
# print(ret)
if __name__ == '__main__':
if os.path.exists("content.txt"):
os.remove("content.txt")
main()
# time.sleep(5)
# create_wordcloud()
总结:
- 如何分析并找出加载数据的url
- 如何使用requests库的headers解决Referer和User-Agent反扒技术
- 如何找出分页参数实现批量爬取
- 设置代理ip防止被封
- 数据的提取与保存到文件
- 使用jieba库对数据分词清洗
- 使用wordcloud生成指定形状的词云