python爬虫,爬取口红的评论信息(含有数据库,可视化界面,数据分析图,登录界面密码验证等)

      此代码可以满足谷歌浏览器上的京东网上商城里面的商品评论信息的爬取,并且对于爬取的信息保存到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()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个非常有趣的问题。为了爬取网易云音乐的最热评论,并进行数据可视化,我们可以按照以下步骤进行: 1. 分析网易云音乐的评论接口,找到需要的参数和接口地址; 2. 使用 Python 的 requests 库发起 GET 请求,获取评论数据; 3. 使用 BeautifulSoup 或者 PyQuery 等库解析 HTML 页面,提取评论数据; 4. 使用 pandas 库将数据保存到 DataFrame 中,进行数据清洗和统计分析; 5. 使用 matplotlib 或者 seaborn 等库进行数据可视化。 下面是一个简单的示例代码: ```python import requests from bs4 import BeautifulSoup import pandas as pd import matplotlib.pyplot as plt # 歌曲 ID song_id = '123456' # 请求头部信息 headers = { 'Referer': f'https://music.163.com/song?id={song_id}', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', } # 请求参数 params = { 'id': song_id, 'limit': 100, 'offset': 0, 'type': 'hot', } # 请求评论接口 response = requests.get('https://music.163.com/api/v1/resource/comments/R_SO_4_{}?'.format(song_id), headers=headers, params=params) data = response.json() # 解析评论数据 comments = [] for comment in data['hotComments']: content = comment['content'] like_count = comment['likedCount'] comments.append({ 'content': content, 'like_count': like_count, }) # 保存数据到 DataFrame 中 df = pd.DataFrame(comments) # 统计评论点赞数分布 df['like_count'].plot.hist(bins=20) plt.show() ``` 这段代码可以爬取指定歌曲的最热评论,并将点赞数分布进行可视化。当然,这只是一个简单的示例,你可以根据自己的需求对数据进行更加深入的分析和处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值