【Tkinter*】多线程爬取京东商品,并做可视化处理
本帖最后由 小伤口 于 2021-4-5 20:01 编辑京东帮帮怪
程序简介
1 爬取京东评论,绘制成词云
2 爬取最近销量(评论)并用 matplotlib 绘制(京东评论数量即销量)
3 爬取商品信息加用户晒出的商品图片
4 将爬取的信息放在 Tkinter (也要用多线程,防止界面无响应)做的界面上,
以此帮助用户更直观的分析商品 。
界面
使用教程
注:由于打包 exe 总是失败,所以这个程序并没有 exe 文件
0 安装相关模块(这里统一用 pip 安装):
requests 模块:用于爬取商品评论,照片,信息等
pip install requests
BeautifulSoup 模块:用于提取数据
pip install bs4
matplotlib 模块:用于绘制图表
pip install matplotlib
wordcloud 模块:用于绘制词云
pip install wordcloud
1 打开程序:
下载京东帮帮.rar
这个压缩文件 。点击鼠标右键,选择解压文件 。然后解压到你想要解压的位置
完成之后,打开京东帮帮怪这个文件 。
用鼠标双击上图所示的文件
2 运行程序:
找到你想要查询的商品,复制下图箭头指的网络链接
ctrl + v 将链接粘贴到下图所示位置,点击开始搜索
等待加载.....
当出现如下页面时运行成功(一定要刷新页面哦~)
2 程序布局:
点击程序右上角的换张图片
可以不断查看各种用户发的图片
点击查看图片可以更清晰的观看图片
使用说明:
原理讲解
网上爬取京东评论的方法,发现爬取的大半都是好评论,并不能起到太大分析的作用
所以经过筛查发现productPage...
这个 js 文件里面的网址通过修改相应的参数可以爬取好评,中评,差评和最新评论数等 。
https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=1914356&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
由于单线程爬取过慢,不能让用户等太久,况且很容易被封 IP 所以就用多线程实现
导入import queue
import threading
创建多线程(爬取时间的就不放了哈~)
# 创建多线程
class MyThread(threading.Thread):
def __init__(self, q):
threading.Thread.__init__(self)
self.q = q
# 调用get_index()
def run(self) -> None:
self.get_index()
def get_index(self):
url = self.q.get()
# 加请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
res = requests.get(url, headers=headers)
jd = json.loads(res.text.lstrip("jQuery593159(").rstrip(");"))
with open("data.txt", "a", encoding="utf-8") as file:
for i in jd['comments']:
file.write(i['content'] + '\n')
try:
for each in i['images']:
photo = each['imgUrl'].split('//')
photo = photo[-1]
photo = 'https://' + photo
print(photo)
zhao_pian.append(photo)
except:
pass
爬取评论我用了 5 个线程
所以用for i in range(5):
locals()['MyThread_' + str(i)] = MyThread
创建了 5 个线程省去一些重复代码 。
虽然用了多线程但还是不能在短时间内爬取所有评论 。由于京东评论数即销量,
所以爬取最新评论的时间,按月来作为 x 轴的单位,将同一个月评论的时间相加作为每个
月的销量即 y 轴
代码实现:
#将时间提取出来,并进行排序计数
with open("data2.txt") as file:
for line in file.readlines():
dict_data.append(int(line))
dict_data.sort()
dic = collections.Counter(dict_data)
for i in dic:
dict_data2.append(str(i))
dict_data3.append(dic)
绘制折线图
x = np.array(dict_data2)
y = np.array(dict_data3)
fig=plt.figure(figsize=(25, 10))
fig.patch.set_facecolor('Turquoise')
ax = fig.add_subplot(111)
ax.patch.set_facecolor('DeepSkyBlue')
plt.plot(x, y, 'r')# 折线 1 x 2 y 3 color
plt.plot(x, y, 'red', lw=2)# 4 line w
plt.scatter(x, y, color='red', marker='o')
font = FontProperties(fname="mnjzbh.ttf")
plt.title("销售趋势(按时间顺序)", fontsize=24,fontproperties=font)
plt.xlabel("时间(年,月)", fontsize=14,fontproperties=font)
plt.ylabel("销售数量(件)", fontsize=14,fontproperties=font)
plt.savefig('Figure_1.png', bbox_inches='tight')
plt.show()
完整的爬虫代码(可以复制直接使用哦~)
**** Hidden Message *****
源码:
**** Hidden Message *****
宣传
下方二维码是我的微信公众号(懂的都懂)
写文章不易,求评分~,求评分~,求评分~
{:9_221:} {:9_221:} {:9_221:}
给各位看官大佬磕头了
{:9_224:} {:9_224:} {:9_224:} https://www.bilibili.com/video/BV1qV411n7Jz?share_source=copy_web
求三连~
(主要是挂件要到期了,想混点积分{:10_266:} 。) 芜湖~ 昨非 发表于 2021-4-5 20:04
芜湖~
谢谢大佬的每次支持
让俺才一直有动力{:9_221:}
{:9_221:} 小伤口 发表于 2021-4-5 20:15
谢谢大佬的每次支持
让俺才一直有动力
我不是大佬,这玩意我写起来怕是费劲多了{:10_250:} 小伤口 发表于 2021-4-5 20:15
谢谢大佬的每次支持
让俺才一直有动力
真的只是比你能水罢了{:10_250:} 昨非 发表于 2021-4-5 20:18
真的只是比你能水罢了
每个月帮好多鱼友解决问题,还会多种语言,单片机。我还早呢{:10_266:} 小伤口 发表于 2021-4-5 20:22
每个月帮好多鱼友解决问题,还会多种语言,单片机。我还早呢
我会个屁啊{:10_285:} 大...大佬{:10_247:} 小伤口厉害了~ 优秀!点赞先 {:10_256:} 膜拜大佬 厉害厉害 ,能秒杀东西吗?
old_叶 发表于 2021-4-5 22:43
厉害厉害 ,能秒杀东西吗?
不行{:10_319:},
秒杀的话selenium应该挺容易实现{:10_275:} hrp 发表于 2021-4-5 21:07
大...大佬
真...过奖了{:10_266:}
谢谢大佬支持 yayc_zcyd 发表于 2021-4-5 21:09
小伤口厉害了~
小伤口太疼了{:10_254:} {:10_245:} 昨非 发表于 2021-4-5 20:04
芜湖~
笔趣阁那个进度咋样啦{:10_297:} 厉害,厉害!
像大佬学习{:5_106:}