此代码可以满足谷歌浏览器上的京东网上商城里面的商品评论信息的爬取,并且对于爬取的信息保存到csv文件中,进而保存到数据库李(SQlite),也可以根据csv文件的信息进行评论数据的分析,才进行可视化分析(饼状图),全程有界面进行登录
为了完整运行代码,先检查是否安装了对应的程序:
GUI SQlite
import requests
from pprint import pprint
import csv
import random
import time
import matplotlib.pyplot as plt
import numpy as np
import json
import PySimpleGUI as sg
userlist = [] # 存放所有的用户名
pwdlist = [] # 存放所有的用户密码
blacklist = [] # 存放所有的黑名单用户
x = 0
y = 0
z = 0
def panduan(username ):
danger = ["傻", "蠢", "笨", "呆", "愚"]
#username = input('欢迎注册,请输入用户名:')
usernames = list(username)#将字符串变为单个字符
k=1
while k:
for i in usernames:
if i in danger:
print("重新输入用户名,含有关键字")
k=0
return 1
else:
print("名称合理")
return 0
# 封装一个函数 完成注册功能
def register():
layout = [
[sg.Text('请输入您的信息,用于注册')],
[sg.Text('账号'), sg.InputText()],
[sg.Text('密码'), sg.InputText()],
[sg.Button('确定'), sg.Button('取消')]
]
window = sg.Window('Python GUI', layout)
while True:
event, values = window.read()
if event == None:#差 关闭窗口结束输入
break
if event == '确定':#确定进行赋值
c = values[0]
d = values[1]
window.close()
# 定义一个变量。用于控制外循环
site = True
# 循环执行 用户名输入操作
while site:
# 用户输入用户名
username = c
if (panduan(username) ) :
print("账号名称错误")
return 1
site = False
break
# 用户名需要检测是否已经存在
if username in userlist:
print('当前用户名已经存在,请更换用户名')
site=False
else:
# 循环输入密码,如果都正确,循环结束,
while True:
# 输入密码
pwd = int(d)
# 检测密码从长度不能低于3位
# 输入确认密码
#repwd = input('请输入确认密码:')
layout = [
[sg.Text('请输入您的密码')],
[sg.Text('密码'), sg.InputText()],
[sg.Button('确定'), sg.Button('取消')]
]
window = sg.Window('Python GUI', layout)
while True:
event, values = window.read()
if event == None: # 差 关闭窗口结束输入
break
if event == '确定': # 确定进行赋值
f = int(values[0])
window.close()
# 检测确认密码是否和密码一致
if pwd == f:
# 用户名和密码都正确,就可以写入文件 用户名:密码
# 打开文件,写入数据
with open('./userr.txt','w+',encoding='utf-8') as fp:
fp.write(f'{username}:{pwd}\n')
print(f'注册成功:用户名:{username}')
# 结束循环
# 结束外循环
site = False
# 结束内循环
break
else:
print('两次密码不一致,请重新输入')
# 封装函数实现登录功能
def login():
# 定义变量 控制登录的外循环
islogin = True
# 定义变量,用户密码的错误次数的检测
errornum = 3
with open('./userr.txt','r') as fp:
fp.seek(0) # 调整当前的的指针位置到文件头部
res = fp.readlines() # 按照每一行读取所有的用户数据
for i in res: # 循环读取的每一行数据
r = i.strip() # 处理每一个换行 admin:123\n ==> admin:123
arr = r.split(':') # admin:123 ==> ['admin','123']
userlist.append(arr[0]) # 把用户名追加到 用户名列表中
pwdlist.append(arr[1]) # 把用户对应的密码 追加到 用户密码 列表中
#print(userlist[0])
# 获取黑名单数据
with open('./black.txt','w+',encoding='utf-8') as fp:
fp.seek(0)
res = fp.readlines()
for i in res:
blacklist.append(i.strip())
#用户登录页面
layout = [
[sg.Text('请输入您的信息,用于登录')],
[sg.Text('账号'), sg.InputText()],
[sg.Text('密码'), sg.InputText()],
[sg.Button('确定'), sg.Button('取消')]
]
window = sg.Window('Python GUI', layout)
while True:
event, values = window.read()
if event == None: # 差 关闭窗口结束输入
break
if event == '确定': # 确定进行赋值
c = values[0]
d = values[1]
window.close()
# 循环执行用户的登录
while islogin:
# 获取用户登录时输入的用户名
username = c
# 检测当前用户名是否存在
if username in userlist:
# 检测用户是否属于锁定状态? 判断是否在黑名单中
if username in blacklist:
print('当前用户属于锁定状态,不可登录,请去忏悔把。。。')
else:
# 定义循环,执行密码输入
while True:
# 让用户输入密码
pwd = d
# 获取用户名在用户列表中的索引,获取位置一一对应
inx = userlist.index(username)
# 检测用户输入的密码是否正确
if pwd == pwdlist[inx]:
print('登录成功')
# 结束循环
islogin = False # 结束外循环变量
break # 结束内循环
else:
# 密码错误,则修改次数变量
errornum -= 1
break
# 判断当前的密码错误次数 == 0
if errornum == 0:
print('曾经有那么几次机会摆在你的面前。你没有把握住,恭喜你,成功的锁定了你的账户,请联系相关人员进行忏悔把!')
# 如何才能锁定账户信息? 把需要锁卡的用户拉入黑名单
with open('./black.txt','w+',encoding='utf-8') as fp:
fp.write(username+'\n')
# 结束循环
islogin = False # 结束外循环变量
break # 结束内循环
else:
print(f'密码输入错误,请重新输入密码,你还有{errornum}次机会')
else:
#用户名不存在
print('用户名错误,请重新输入')
break
myclass = []
if register() == 1:
exit(0)
login()
layout = [
[sg.Text('请输入您想要爬取的页数')],
[sg.Text('页数'), sg.InputText()],
[sg.Button('确定'), sg.Button('取消')]
]
window = sg.Window('Python GUI', layout)
while True:
event, values = window.read()
if event == None:#差 关闭窗口结束输入
break
if event == '确定':#确定进行赋值
e = int(values[0])
window.close()
f = open('口红20.csv', mode='a', encoding='utf-8', newline='')
#表头,文件名自定义,其余不变,csv文件
csv_write = csv.DictWriter(f, fieldnames=[
'昵称',
'商品',
'评分',
'购买时间',
'评论时间',
'Plus会员',
'内容',
])
#写表头
csv_write.writeheader()
for page in range(0,e):
print(f"正在采集第{page}页的内容")
time.sleep(random.randint(1,2))#爬取多页是寻找URl的page页规律
#此处为爬取的关键参数如需更换请自行改变参数
url = "https://api.m.jd.com/?appid=item-v3&functionId=pc_club_productPageComments&client=pc&clientVersion=1.0.0&t=1686210322960&loginType=3&uuid=122270672.1686209425895912555730.1686209425.1686209425.1686209426.1&productId=100029079354&score=0&sortType=5&page={}&pageSize=10&isShadowSku=0&rid=0&fold=1&bbtf=&shield=".format(page)
date = {
'productId': '100029079354',
'score': '0',
'sortType': '5',
'page': page,
'pageSize': '10',
'isShadowSku': '0',
'rid': '0',
'fold': '1',
}#请求参数
headers = {
'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36'
}#身份
response=requests.get(url=url,params=date,headers=headers)
#print(response.json()['comments'])
for index in response.json()['comments']:
#print(index)
if index['plusAvailable'] == 201:
Vip = '是'
else:
Vip = '不是'
dit = {
'昵称':index['nickname'],
'商品': index['productColor'],
'评分': index['score'],
'购买时间': index['referenceTime'],
'评论时间': index['creationTime'],
'Plus会员': Vip,
'内容': index['content'].replace('\n',''),
}
#写入数据
csv_write.writerow(dit)
print(dit)
a=dit['评分']
if a == 5:
x=x+1
if a == 4:
y=y+1
else:
z=z+1
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
labels = ['非常好', '一般','还行']
data = [x, y, z]
fig, ax = plt.subplots()
ax.pie(data, labels=labels, autopct='%1.1f%%',
startangle=90, counterclock=False)
# 设置图形的标题
ax.set_title('收集评分的饼状图')
# 将图形变为圆形
ax.axis('equal')
plt.show()