Python爬虫使用实例

news2024/11/24 18:55:45

IDE:大部分是在PyCharm上面写的

解释器装的多 → 环境错乱 → error:没有配置,no model

  • 爬虫可以做什么?

下载数据【文本/二进制数据(视频、音频、图片)】、自动化脚本【自动抢票、答题、采数据、评论、点赞】

  • 爬虫的原理?

通过模拟/控制浏览器(客户端)批量的向服务器请求数据

  • 完成一个完整的爬虫需要的步骤?

获取资源 – 发送请求 – 数据解析 – 保存数据

  • 开发者工具 抓包

Headers 头部信息、数据包请求地址、请求方法、响应头、请求头

Cookie用户身份标识
Host客户端指定想访问的域名地址
Origin资源在服务器的起始位置
Pragma请求地址的查看参数
Referer防盗链告诉服务器我是从哪个网页跳转过来的
User-agent浏览器身份标识
Payload查看参数、请求参数
Preview预览服务器数据
Response响应/回答

有花括号{}的 半结构化数据 json数据 前后端数据交互常用

驼峰命名法 AaBb大驼峰 a_b小驼峰


以下是几个爬虫实例:

1. 豆瓣电影

BV1NY411b7PR

🥝 实现步骤

step: 明确需求 → 发送请求 → 获取数据 → 解析数据(re正则表达式、css选择器、xpath) → 保存数据

🥝 实现代码

实现代码:

import requests # 数据请求模块
import parsel # 数据解析模块
import csv # 保存表格数据

# f=open('douban.csv',mode='w',encoding='utf-8',newline='') # 中文乱码
f=open('douban.csv',mode='w',encoding='utf-8-sig',newline='')

csv_writer =csv.DictWriter(f,fieldnames=[
    '电影名字',
    '详情页',
    #'导演',
    #'主演',
    '演员',
    '年份',
    '国家',
    '电影类型',
    '评分',
    '评论人数',
    '概述',
])
csv_writer.writeheader()
for page in range(0,250,25):
    # url = 'https://movie.douban.com/top250'
    url =f'https://movie.douban.com/top250?start={page}&filter='
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
    }
    response = requests.get(url=url, headers=headers)
    # print(response.text)
    selector = parsel.Selector(response.text)
    lis = selector.css('.grid_view li')  # css选择器
    # selector.xpath('//*[@class="grid_view"]/li') # xpath
    for li in lis:
        # span:nth-child(1) 组合选择器,选择第几个span标签
        # text 获取标签的文本数据
        title = li.css('.hd a span:nth-child(1)::text').get()  # 标题
        href = li.css('.hd a::attr(href)').get()  # 详情页
        # li.xpath('//*[@class="hd"]/a/span(1)/text()').get()
        info = li.css('.bd p::text').getall()
        actor = info[0].strip().split('主演:')  # strip()去字符串两端的空格,split字符串分割
        # director=actor[0].replace('导演:','').strip()
        # performer=actor[0].replace('...','').replace('/','').strip()
        actors = actor[0].replace('...', '').replace('/', '').strip()  # 演员,导演+主演
        others = info[1].strip().split('/')
        year = others[0].strip()  # 年份
        country = others[1].strip()  # 城市
        type = others[2].strip()  # 类型
        scores = li.css('.star span:nth-child(2)::text').get()  # 评分
        #comment = li.css('.star span:nth-child(4)::text').get()  # 评价人数
        comment = li.css('.star span:nth-child(4)::text').get().replace('人评价', '')  # 评价人数
        overview = li.css('.inq::text').get()  # 概述
        # print(title,actor,others)
        # print(director,performer,year,country,type)
        dit={
            '电影名字':title,
            '详情页':href,
            '演员':actors,
            #'导演':director,
            #'主演':performer,
            '年份':year,
            '国家':country,
            '电影类型':type,
            '评分':scores,
            '评论人数':comment,
            '概述':overview,
        }
        csv_writer.writerow(dit)
        print(title, href, actors, year, country, type, scores, comment, overview, sep=' | ')

🥝 部分参数

部分参数来源:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

🥝 运行效果

部分效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🥝 乱码问题

中文乱码问题的解决:
乱码的效果就是它除了数字就全是问号???,哈哈哈哈。🤣

# f=open('douban.csv',mode='w',encoding='utf-8',newline='') # 中文乱码
f=open('douban.csv',mode='w',encoding='utf-8-sig',newline='')

2. 酷狗榜单

BV1ZU4y1B7yY

🥝 实现步骤

step: 发送请求 → 获取数据 → 解析数据

🥝 单个榜单

# pip Install requests
# 导入数据请求模块
import requests
# 导入正则模块,re是内置的,不需要安装
# 在Python中需要通过正则表达式对字符串进⾏匹配的时候,可以使⽤⼀个python自带的模块,名字为re。
import re
# 确定请求地址
url='https://www.kugou.com/yy/html/rank.html'
# 模拟伪装 headers 请求头 <-- 开发者工具里面进行复制粘贴
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
# 发送请求
response = requests.get(url=url,headers=headers)
# print(response)
# <Response [200]> //整体是一个响应对象,200 状态码表示请求成功
#(仅仅表示请求成功,不一定得到想要的数据)
# 获取数据,获取服务器返回响应数据 response.text 获取响应文本数据
# print(response.text)
# 解析数据
Hash_list = re.findall('"Hash":"(.*?)",', response.text)
album_id_list = re.findall('"album_id":(.*?),', response.text)
#print(Hash_list)
#print(album_id_list)
# for循环遍历 把列表里面元素一个一个提取出来
for Hash, album_id in zip(Hash_list, album_id_list):
    # print(Hash,album_id)
    link = 'https://wwwapi.kugou.com/yy/index.php'
    # 请求参数
    data = {
        'r': 'play/getdata',
        # 'callback':'jQuery191022953264396493434_1663671714341',
        'hash': Hash,
        'dfid': '4FII5w3ArJSc0dPjmR1DFIit',
        'appid': '1014',
        'mid': ' 8c6815fe99744abfea7f557377764693',
        'platid': '4',
        'album_id': album_id,
        # 'album_audio_id': '39933554',
        '_': '1663671714343',
    }
    music_data = requests.get(url=link, params=data, headers=headers).json()
    # music_data = requests.get(url=link, params=data, headers=headers).text
    audio_name=music_data['data']['audio_name']
    audio_url = music_data['data']['play_url']
    # print(music_data)
    print(audio_name,':',audio_url)
    # 保存数据
    audio_content = requests.get(url=audio_url, headers=headers).content
    with open('music\\'+audio_name+'.mp3',mode='wb') as f:
        f.write(audio_content)

获取请求地址:
在这里插入图片描述
请求头:
‘user-agent’: ’ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36’ 表示浏览器基本身份标识

第九行代码要注意,如果引号写错了可能报错:

AttributeError: ‘set’ object has no attribute ‘items’

错误写法一:

headers={'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}

headers是字典数据类型,不是集合set。{' '}是集合;{' ':' '}是字典

InvalidHeader: Invalid leading whitespace, reserved character(s), or returncharacter(s) in header value: ’ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36’

错误写法二:

headers={'user-agent': ' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}

多了个空格,小错误要注意。

re模块findall方法

re.findall() →找到所有我们想要的数据内容

解析的时候,hash、album


比较长,一次不好截,
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


错位❌写法:

music_data = requests.get(url=link, params=data, headers=headers).json()

requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

在这里插入图片描述

不是json格式,多了一部分,把callback删掉可以,或者用text

response.json →获取json字典数据

取歌曲名字和url

在这里插入图片描述

在这里插入图片描述

with open('music\\'+audio_name+'.mp3') as f:

FileNotFoundError: [Errno 2] No such file or directory: ‘music\李玖哲 - 解脱.mp3’

文件夹不存在(music),即使music文件夹已在,仍报错,可以改成:

with open('music\\'+audio_name+'.mp3',mode='wb') as f:

效果

在这里插入图片描述

在这里插入图片描述

🥝 多个榜单

import requests
import re

url='https://www.kugou.com/yy/html/rank.html'
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
response = requests.get(url=url,headers=headers)
#print(response.text)
music_list = re.findall('<a title="(.*?)" .*? hidefocus="true" href="(.*?)">', response.text)[1:]

# print(music_list)
# 从第几个开始爬,3(切片)
# for title,index in music_list[3:]:
for title,index in music_list:
    print(title)
    # url = 'https://www.kugou.com/yy/html/rank.html'
    # 模拟伪装 headers 请求头 <-- 开发者工具里面进行复制粘贴
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
    # 发送请求
    response = requests.get(url=index, headers=headers)
    # print(response)
    # <Response [200]> //整体是一个响应对象,200 状态码表示请求成功
    # (仅仅表示请求成功,不一定得到想要的数据)
    # 获取数据,获取服务器返回响应数据 response.text 获取响应文本数据
    Hash_list = re.findall('"Hash":"(.*?)",', response.text)
    album_id_list = re.findall('"album_id":(.*?),', response.text)
    # print(Hash_list)
    # print(album_id_list)
    # for循环遍历 把列表里面元素一个一个提取出来
    for Hash, album_id in zip(Hash_list, album_id_list):
        # print(Hash,album_id)
        link = 'https://wwwapi.kugou.com/yy/index.php'
        # 请求参数
        data = {
            'r': 'play/getdata',
            # 'callback':'jQuery191022953264396493434_1663671714341',
            'hash': Hash,
            'dfid': '4FII5w3ArJSc0dPjmR1DFIit',
            'appid': '1014',
            'mid': ' 8c6815fe99744abfea7f557377764693',
            'platid': '4',
            'album_id': album_id,
            # 'album_audio_id': '39933554',
            '_': '1663671714343',
        }
        music_data = requests.get(url=link, params=data, headers=headers).json()
        # music_data = requests.get(url=link, params=data, headers=headers).text
        audio_name = music_data['data']['audio_name']
        audio_name = re.sub(r'[\/:*?"<>|]','',audio_name)
        audio_url = music_data['data']['play_url']
        if audio_url:
            # print(music_data)
            print(audio_name, ':', audio_url)
            # 保存数据
            audio_content = requests.get(url=audio_url, headers=headers).content
            with open('music\\' + audio_name + '.mp3', mode='wb') as f:
                f.write(audio_content)

在这里插入图片描述
在这里插入图片描述
第一个不要,做个切片

第一个网址打开是这样的

在这里插入图片描述

music_list = re.findall('<a title="(.*?)" hidefocus="true" href="(.*?)"', response.text)[1:]

requests.exceptions.MissingSchema: Invalid URL ‘’: No scheme supplied. Perhaps you meant http://?

报错位置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

请求链接🔗不对,无法下载,改代码,让他直接跳过

OSError: [Errno 22] Invalid argument: ‘music\Stingray、Backstreet Boys - I Want It That Way (In the Style of Backstreet Boys|Karaoke Version).mp3’

特殊字符 → windows系统文件名不能包含

在这里插入图片描述

re.sub(r'[\/:*?"<>|]','',audio_name)

在这里插入图片描述

在这里插入图片描述

能跳过,但是有重复,就很怪

import requests
import re

url='https://www.kugou.com/yy/html/rank.html'
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
response = requests.get(url=url,headers=headers)
#print(response.text)
music_list = re.findall('<a title="(.*?)" .*? hidefocus="true" href="(.*?)">', response.text)[1:]

# print(music_list)
# 从第4个开始爬,3(切片),0开始
# for title,index in music_list[3:]:
for title,index in music_list:
    print(title)
    # url = 'https://www.kugou.com/yy/html/rank.html'
    # 模拟伪装 headers 请求头 <-- 开发者工具里面进行复制粘贴
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
    # 发送请求
    response = requests.get(url=index, headers=headers)
    # print(response)
    # <Response [200]> //整体是一个响应对象,200 状态码表示请求成功
    # (仅仅表示请求成功,不一定得到想要的数据)
    # 获取数据,获取服务器返回响应数据 response.text 获取响应文本数据
    Hash_list = re.findall('"Hash":"(.*?)",', response.text)
    album_id_list = re.findall('"album_id":(.*?),', response.text)
    # print(Hash_list)
    # print(album_id_list)
    # for循环遍历 把列表里面元素一个一个提取出来
    for Hash, album_id in zip(Hash_list, album_id_list):
        # print(Hash,album_id)
        link = 'https://wwwapi.kugou.com/yy/index.php'
        # 请求参数
        data = {
            'r': 'play/getdata',
            # 'callback':'jQuery191022953264396493434_1663671714341',
            'hash': Hash,
            'dfid': '4FII5w3ArJSc0dPjmR1DFIit',
            'appid': '1014',
            'mid': ' 8c6815fe99744abfea7f557377764693',
            'platid': '4',
            'album_id': album_id,
            # 'album_audio_id': '39933554',
            '_': '1663671714343',
        }
        music_data = requests.get(url=link, params=data, headers=headers).json()
        # music_data = requests.get(url=link, params=data, headers=headers).text
        try:
            audio_name = music_data['data']['audio_name']
            audio_name = re.sub(r'[\/:*?"<>|]', '', audio_name)
            audio_url = music_data['data']['play_url']
        except Exception as KeyError:
            print("skip this music,becuuse it cannot play")
        if audio_url:
            print(audio_name, ':', audio_url)
            # 保存数据
            audio_content = requests.get(url=audio_url, headers=headers).content
            with open('music\\' + audio_name + '.mp3', mode='wb') as f:
                f.write(audio_content)

🥝 完善版本

import requests
import re

url='https://www.kugou.com/yy/html/rank.html'
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
response = requests.get(url=url,headers=headers)
#print(response.text)
music_list = re.findall('<a title="(.*?)" .*? hidefocus="true" href="(.*?)">', response.text)[1:]

# print(music_list)
# 从第4个开始爬,3(切片),0开始
# for title,index in music_list[3:]:
for title,index in music_list:
    print(title)
    # url = 'https://www.kugou.com/yy/html/rank.html'
    # 模拟伪装 headers 请求头 <-- 开发者工具里面进行复制粘贴
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
    # 发送请求
    response = requests.get(url=index, headers=headers)
    # print(response)
    # <Response [200]> //整体是一个响应对象,200 状态码表示请求成功
    # (仅仅表示请求成功,不一定得到想要的数据)
    # 获取数据,获取服务器返回响应数据 response.text 获取响应文本数据
    Hash_list = re.findall('"Hash":"(.*?)",', response.text)
    album_id_list = re.findall('"album_id":(.*?),', response.text)
    # print(Hash_list)
    # print(album_id_list)
    # for循环遍历 把列表里面元素一个一个提取出来
    for Hash, album_id in zip(Hash_list, album_id_list):
        # print(Hash,album_id)
        link = 'https://wwwapi.kugou.com/yy/index.php'
        # 请求参数
        data = {
            'r': 'play/getdata',
            # 'callback':'jQuery191022953264396493434_1663671714341',
            'hash': Hash,
            'dfid': '4FII5w3ArJSc0dPjmR1DFIit',
            'appid': '1014',
            'mid': ' 8c6815fe99744abfea7f557377764693',
            'platid': '4',
            'album_id': album_id,
            # 'album_audio_id': '39933554',
            '_': '1663671714343',
        }
        music_data = requests.get(url=link, params=data, headers=headers).json()
        # music_data = requests.get(url=link, params=data, headers=headers).text
        try:
            audio_name = music_data['data']['audio_name']
            audio_name = re.sub(r'[\/:*?"<>|]', '', audio_name)
            audio_url = music_data['data']['play_url']
            if audio_url:
                print(audio_name, ':', audio_url)
                # 保存数据
                audio_content = requests.get(url=audio_url, headers=headers).content
                with open('music\\' + audio_name + '.mp3', mode='wb') as f:
                    f.write(audio_content)
        except Exception as KeyError:
            pass

try-except的妙用,直接跳过一些错误/null的歌曲,比之前的多榜代码好一些。

3. 千千音乐

查单曲的params
在这里插入图片描述

# 千千音乐
import requests
import time
import hashlib

url='https://music.91q.com/v1/song/tracklink'

# 要其他歌曲修改这个params就可以了
params={
'sign': 'aeb1fc52109d5dd518d02f4548936a0b',
'TSID': 'T10045980539',
'appid': 16073360,# 不变
'timestamp':1658711978,
}

headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}

response=requests.get(url=url,params=params,headers=headers)

music_url=response.json()['data']['path']
music_title=response.json()['data']['title']
music_singer=response.json()['data']['artist'][0]['name']
print(music_title,music_singer,music_url)

4. 微博热搜

# pip install lxml
# 微博热搜
import requests
from lxml import etree
import time
url='https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr='
header={'cookie':"SINAGLOBAL=7254774839451.836.1628626364688; SUB=_2AkMWR_ROf8NxqwJRmf8cymjraIt-ygDEieKgGwWVJRMxHRl-yT9jqmUgtRB6PcfaoQpx1lJ1uirGAtLgm7UgNIYfEEnw; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WWEs5v92H1qMCCxQX.d-5iG; UOR=,,www.baidu.com; _s_tentry=-; Apache=1090953026415.7019.1632559647541; ULV=1632559647546:8:4:2:1090953026415.7019.1632559647541:1632110419050; WBtopGlobal_register_version=2021092517; WBStorage=6ff1c79b|undefined",
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'}
resp = requests.get (url,headers=header)
resp1 = resp.content.decode(encoding='utf-8',errors='ignore')
resp2=etree.HTML(resp1)
title = resp2.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr/td/a/text()')
print(time.strftime("%F,%R")+'微博热搜:')
for i in range(51):
    print (f'{i} '+''.join([title[i]]))
time.sleep(1)

在这里插入图片描述
后面还有很多,截图未完,但效果大概就是这样子的

5. 当当榜单

在这里插入图片描述

🥝 书籍数据

# 导入数据请求模块
import requests
# 导入数据解析模块
import parsel
# 导入csv模块 ---> 内置模块 不需要安装
import csv

# 创建文件
f = open('书籍data25页.csv', mode='a', encoding='utf-8', newline='')
# f文件对象 fieldnames 字段名 ---> 表格第一行 作为表头
csv_writer = csv.DictWriter(f, fieldnames=['标题','评论','推荐',\
                                           '作者','日期','出版社','售价',\
                                           '原价','折扣','电子书','详情页',])
# 写入表头
csv_writer.writeheader()
"""
1. 发送请求, 模拟浏览器对于url发送请求
    - 等号左边是定义变量名
    - 模拟浏览器 ---> 请求头
        headers ---> 在开发者工具里面复制粘贴 字典数据类型
        一种简单反反爬手段, 防止被服务器识别出来是爬虫程序
    - 使用什么请求方式, 根据开发者工具来的
"""
for page in range(1, 26): #  1,26 是取1-25的数字, 不包含26
    # 确定请求网址
    url = f'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-{page}'
    # 模拟浏览器 ---> 请求头
    headers = {
        # User-Agent 用户代理 表示浏览器基本身份标识
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
    }
    # 发送请求 返回的响应对象 ---> <Response [200]>: <> 表示对象  response 响应回复  200状态码 表示请求成功
    response = requests.get(url=url, headers=headers)
    print(response)
    # 2. 获取数据, 获取服务器返回响应数据 ---> 开发者工具里面 response  print(response.text)
    """
    3. 解析数据, 提取我们想要数据内容, 书籍基本信息
    根据得到数据类型以及我们想要数据内容, 选择最适合解析方法:
        - re正则表达式
        - css选择器
        - xpath
    xpath --->  根据标签节点提取数据
    css选择器 ---> 根据标签属性提取数据内容
        css语法匹配  不会 1  会的 2
        复制粘贴会不会 ---> ctrl + C  ctrl + v
    """
    # 转数据类型 <Selector xpath=None data='<html xmlns="http://www.w3.org/1999/x...'>
    selector = parsel.Selector(response.text)
    # 第一次提取 提取所有li标签 --> 返回列表, 元素Selector对象
    lis = selector.css('.bang_list_mode li')
    # for循环遍历 之后进行二次提取 我们想要内容
    for li in lis:
        """
        attr() 属性选择器 
        a::attr(title) ---> 获取a标签里面title属性
        get() 获取一个 第一个 
        """
        title = li.css('.name a::attr(title)').get()  # 标题
        star = li.css('.star a::text').get().replace('条评论', '')  # 评论
        recommend = li.css('.tuijian::text').get().replace('推荐', '')  # 推荐
        author = li.css('.publisher_info a::attr(title)').get()  # 作者
        date = li.css('.publisher_info span::text').get()  # 日期
        press = li.css('div:nth-child(6) a::text').get()  # 出版社
        price_n = li.css('.price .price_n::text').get()  # 售价
        price_r = li.css('.price .price_r::text').get()  # 原价
        price_s = li.css('.price .price_s::text').get().replace('折', '')  # 折扣
        price_e = li.css('.price .price_e .price_n::text').get()  # 电子书
        href = li.css('.name a::attr(href)').get()  # 详情页
        # 保存数据
        #源码、解答、教程加Q裙:261823976
        dit = {'标题': title,'评论': star,'推荐': recommend,'作者': author,\
               '日期': date,'出版社': press,'售价': price_n,'原价': price_r,\
               '折扣': price_s,'电子书': price_e,'详情页': href,}
        # 写入数据
        csv_writer.writerow(dit)
        print(title, star, recommend, author, date, press, price_n, price_r, price_s, price_e, href, sep=' | ')

🥝 获取评论

短评
在这里插入图片描述
长评
在这里插入图片描述
一开始能用,后来报错,就用扣钉重新运行了一下,可以。

raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

# 导入数据请求模块
import time
import requests
import re
for page in range(1, 11): # 第1-第10页的评论
    time.sleep(1.5)
    # 确定网址
    url = 'http://product.dangdang.com/index.php'
    # 请求参数
    data = {
        'r': 'comment/list',
        'productId': '27898031',
        #'productId': '25201859', # 《钝感力》
        'categoryPath': '01.43.77.07.00.00',
        'mainProductId': '27898031',
        #'mainProductId': '25201859',
        'mediumId': '0',
        'pageIndex': page,
        'sortType': '1',
        'filterType': '1',
        'isSystem': '1',
        'tagId': '0',
        'tagFilterCount': '0',
        'template': 'publish',
        'long_or_short': 'short',# 短评
    }
    headers = {
        'Cookie': '__permanent_id=20220526142043051185927786403737954; dest_area=country_id%3D9000%26province_id%3D111%26city_id%20%3D0%26district_id%3D0%26town_id%3D0; ddscreen=2; secret_key=f4022441400c500aa79d59edd8918a6e; __visit_id=20220723213635653213297242210260506; __out_refer=; pos_6_start=1658583812022; pos_6_end=1658583812593; __trace_id=20220723214559176959858324136999851; __rpm=p_27898031.comment_body..1658583937494%7Cp_27898031.comment_body..1658583997600',
        'Host': 'product.dangdang.com',
        'Referer': 'http://product.dangdang.com/27898031.html',
        #'Referer': 'http://product.dangdang.com/25201859.html',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36',
    }
    response = requests.get(url=url, params=data, headers=headers)
    html_data = response.json()['data']['list']['html']
    content_list = re.findall("<span><a href='.*?' target='_blank'>(.*?)</a></span>", html_data)
    for content in content_list:
        with open('评论.txt', mode='a', encoding='utf-8') as f:
            f.write(content)
            f.write('\n')
        print(content)

对一下最后一句评论,对的上。# 《钝感力》最后一句评论是质量挺好,印刷纸质都很好,内容上觉得有道理,又不是很能说服人,个人感受

🥝 词云显示

在这里插入图片描述

import jieba
import wordcloud
#import imageio
import imageio.v2 as imageio
# 读取图片
py = imageio.imread('python.gif')
# 打开文件
f = open('评论.txt', encoding='utf-8')
# 读取内容
txt = f.read()
# jieba模块进行分词  ---> 列表
txt_list = jieba.lcut(txt)
print(txt_list)
# join把列表合成字符串
string = ' '.join(txt_list)
# 使用词云库
wc = wordcloud.WordCloud(
    height=300,  # 高度
    width=500,  # 宽度
    background_color='white',  # 背景颜色
    font_path='msyh.ttc',  # 字体
    scale=15, # 轮廓
    stopwords={'的', '了', '很', '也'},  # 停用词
    mask=py  # 自定义词云图样式
)
wc.generate(string)  # 需要做词云数据传入进去
wc.to_file('1.png')  # 输入图片

🥝 关于词云

词云:wordcloud

安装:

pip install wordcloud

实现步骤:

读取词云的文本文件 → WordCloud().generate(txt)to_image()建立词云图像文件 → show()显示词云

用法:

在这里插入图片描述

# pip install wordcloud
# pip install jieba # 中文-jieba
import wordcloud
import jieba

# 注意把字体导进去,如果用到要写中文要把能显示中文的字体(很多都行)导进去
wd = wordcloud.WordCloud(font_path="A73方正行黑简体.ttf")  # 配置对象参数
txt=' '.join(jieba.cut("wordcloud python 猫咪 但是"))
wd.generate(txt)  # 加载词云文本
wd.to_file("wd.png") 

在这里插入图片描述
text.txt

text
dog dog dog 
dog dog dog 
fish
cat 
cat
# pip install wordcloud
# from wordcloud import WordCloud 后面就用WordCloud
import wordcloud
# 读取文本文件
with open('text.txt') as f:
    txt=f.read()
wd=wordcloud.WordCloud().generate(txt) 
wd.to_image().show() # 建立词云图像文件并显示
wd.to_file("wd.png")

或者,不从外面读,写成字符串

# pip install wordcloud
# from wordcloud import WordCloud 后面就用WordCloud
import wordcloud
# 文本
txt="text dog dog dog dog dog dog fish cat cat"
wd=wordcloud.WordCloud().generate(txt) 
wd.to_image().show() # 建立词云图像文件并显示
wd.to_file("wd.png")
乱码问题

词云中文乱码问题

中文词云失败的解决方法jieba
文本文件中有中文,在扣钉中会变框框,在PyCharm中报错。
在这里插入图片描述

UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xab in position 53: incomplete multibyte sequence

解决方法:
在这里插入图片描述

# pip install wordcloud
# pip install jieba
# from wordcloud import WordCloud 后面就用WordCloud
import wordcloud
import jieba
# 读取文本文件
with open('text.txt',encoding='utf-8') as f:
    txt=f.read()
# generate(txt)根据文本生成词云
wd=wordcloud.WordCloud(font_path="A73方正行黑简体.ttf").generate(txt) 
wd.to_image().show() # 建立词云图像文件并显示
wd.to_file("wd.png") # 输出到文件

在这里插入图片描述

jieba模块

jieba模块

安装模块:

pip  install jieba 

分词模式:

jieba 是Python中的中文分词库,提供以下三种分词模式:

  1. 精确模式 jieba.lcut(str)
  2. 全模式 jieba.lcut(str,cut_all=True)
  3. 搜索引擎模式 jieba.lcut_for_search(str)
import jieba
s = "中国是一个伟大的国家"
print(jieba.lcut(s)) # 精准模式
# 输出结果: ['中国', '是', '一个', '伟大', '的', '国家']
print(jieba.lcut(s,cut_all=True)) # 全模式
# 输出结果:['中国', '国是', '一个', '伟大', '的', '国家']
s1 = "中华人民共和国是伟大的"
print(jieba.lcut_for_search(s1)) # 搜索引擎模式
# 输出结果 : 
# ['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '伟大', '的']

jieba模块的cut()方法

import jieba
txt="我的妹妹是一只猫"
words=jieba.cut(txt)
for word in words:
   print(word)

Building prefix dict from the default dictionary …
Dumping model to file cache /tmp/jieba.cache
Loading model cost 0.952 seconds.
Prefix dict has been built succesfully.


我 的 妹妹 是 一只 猫

jieba猫猫Python猫猫jieba Matplotlib jieba,Python

在这里插入图片描述

# pip install wordcloud
# pip install jieba
# from wordcloud import WordCloud 后面就用WordCloud
import wordcloud
import jieba
# 读取文本文件
with open('text.txt',encoding='utf-8') as f:
    txt=f.read()
cut_text=' '.join(jieba.cut(txt))
# generate(txt)根据文本生成词云
wd=wordcloud.WordCloud(font_path="A73方正行黑简体.ttf").generate(cut_text) 
wd.to_image().show() # 建立词云图像文件并显示
wd.to_file("wd.png") # 输出到文件
词云参数

在这里插入图片描述
在这里插入图片描述

与matplotlib联用

在这里插入图片描述

text
dog dog dog 
dog dog dog 
fish
cat 
cat
狗
# pip install wordcloud
# pip install jieba
# from wordcloud import WordCloud 后面就用WordCloud
import wordcloud
import jieba
import matplotlib.pyplot as plt
# 读取文本文件
with open('text.txt',encoding='utf-8') as f:
    txt=f.read()
# generate(txt)根据文本生成词云
wd=wordcloud.WordCloud(font_path="A73方正行黑简体.ttf",
                       background_color="lightblue",
                       width=800,
                       height=600).generate(txt)
plt.imshow(wd)
plt.savefig("wd.png") # 输出到文件
plt.show()

plt.axis("off") # 关闭轴线

在这里插入图片描述

# pip install wordcloud
# pip install jieba
# from wordcloud import WordCloud 后面就用WordCloud
import wordcloud
import jieba
import matplotlib.pyplot as plt
# 读取文本文件
with open('text.txt',encoding='utf-8') as f:
    txt=f.read()
# generate(txt)根据文本生成词云
wd=wordcloud.WordCloud(font_path="A73方正行黑简体.ttf",
                       background_color="lightblue",
                       width=800,
                       height=600).generate(txt)
plt.imshow(wd)
plt.axis("off") # 关闭轴线
plt.savefig("wd.png") # 输出到文件
plt.show()
词云形状

WordCloud(mask=)

一般的图片可能要先进行去底再使用
在线去底 https://www.aigei.com/bgremover/
在这里插入图片描述

# pip install wordcloud
# pip install jieba
# from wordcloud import WordCloud 后面就用WordCloud
import wordcloud
import jieba
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
# 读取文本文件
with open('text.txt',encoding='utf-8') as f:
    txt=f.read()
cut_text=' '.join(jieba.cut(txt))
bgimage=np.array(Image.open('python(已去底).gif'))
# generate(txt)根据文本生成词云
wd=wordcloud.WordCloud(font_path="A73方正行黑简体.ttf",\
                       background_color="white",mask=bgimage).generate(cut_text) 
plt.imshow(wd)
plt.axis("off")
plt.savefig("wd.png") # 输出到文件
plt.show()

imageio 则不去底

# pip install wordcloud
# pip install jieba
# pip install imageio
# from wordcloud import WordCloud 后面就用WordCloud
import wordcloud
import jieba
import imageio
import matplotlib.pyplot as plt
# 读取文本文件
with open('text.txt',encoding='utf-8') as f:
    txt=f.read()
cut_text=' '.join(jieba.cut(txt))
bgimage=imageio.imread('python.gif')
# generate(txt)根据文本生成词云
wd=wordcloud.WordCloud(font_path="A73方正行黑简体.ttf",\
                       background_color="white",mask=bgimage).generate(cut_text) 
plt.imshow(wd)
plt.axis("off")
plt.savefig("wd.png") # 输出到文件
plt.show()

可视化词云包-Stylecloud

https://github.com/minimaxir/stylecloud

https://fontawesome.com/

https://fontawesome.dashgame.com/

https://fa5.dashgame.com/#/

在这里插入图片描述

import pandas as pd
import jieba.analyse
from stylecloud import gen_stylecloud
with open('text.txt',encoding='utf-8') as f:
    txt=f.read()
cut_text=' '.join(jieba.cut(txt))
gen_stylecloud(text=cut_text,icon_name='fas fa-comment-dots',
               font_path="A73方正行黑简体.ttf",background_color='white',output_name='wd.jpg')
print('绘图成功!')

在这里插入图片描述
在这里插入图片描述


stylecloud.png

import stylecloud
stylecloud.gen_stylecloud(file_path='text.txt', 
                          icon_name= 'fas fa-dog',
                          font_path="A73方正行黑简体.ttf",
                          palette='colorbrewer.diverging.Spectral_11',                        
                          background_color='black',                        
                          gradient='horizontal')
# palette:调色板(通过 palettable 实现)[默认值:cartocolors.qualitative.Bold_5]

字体颜色color

在这里插入图片描述

import stylecloud
stylecloud.gen_stylecloud(file_path='text.txt', 
                          icon_name= 'fas fa-dog',
                          font_path="A73方正行黑简体.ttf",
                          palette='colorbrewer.diverging.Spectral_11',                        
                          background_color='black',  # 背景色
                          colors='white',# 字体颜色
                          gradient='horizontal'# 梯度)

反向遮罩invert_mask
在这里插入图片描述

import stylecloud
stylecloud.gen_stylecloud(file_path='text.txt', 
                          icon_name= 'fas fa-dog',
                          font_path="A73方正行黑简体.ttf",
                          palette='colorbrewer.diverging.Spectral_11',                        
                          background_color='black',  # 背景色
                          colors='white',# 字体颜色
                          invert_mask=True, # 反向遮罩
                          gradient='horizontal')

调色板palette
palettable 网站: https://jiffyclub.github.io/palettable/
在这里插入图片描述

import stylecloud
stylecloud.gen_stylecloud(file_path='text.txt', 
                          icon_name= 'fab fa-twitter',
                          font_path="A73方正行黑简体.ttf",
                          palette='cartocolors.diverging.TealRose_7',                        
                          background_color='white',  # 背景色
                          gradient='horizontal')

在这里插入图片描述

import stylecloud
stylecloud.gen_stylecloud(file_path='评论.txt', 
                          icon_name= 'fab fa-qq',
                          font_path="A73方正行黑简体.ttf",
                          palette='tableau.BlueRed_6',                        
                          background_color='white',  # 背景色
                          gradient='horizontal',size=400,
                          output_name='书评.png')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2045860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.2 实体-关系模型(ER模型)

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

Keycloak中授权的实现-转载

在Keycloak中实现授权&#xff0c;首先需要了解与授权相关的一些概念。授权&#xff0c;简单地说就是某个&#xff08;些&#xff09;用户或者某个&#xff08;些&#xff09;用户组&#xff08;Policy&#xff09;&#xff0c;是否具有对某个资源&#xff08;Resource&#xf…

基于SpringBoot的餐饮订单系统-计算机毕业设计源码39867

摘 要 随着现代生活节奏的加快和人们对便捷餐饮服务的需求不断增长&#xff0c;基于Spring Boot的餐饮订单系统的设计与实现成为当前研究的关键课题。本研究旨在开发一款包括首页、通知公告、餐饮资讯、餐饮菜单、商城管理等功能模块的系统&#xff0c;旨在提供便捷高效的餐饮订…

了解一下内测系统

内测系统是什么&#xff1f; 在软件或应用程序开发的过程中&#xff0c;供开发人员进行测试和调试的系统。 内测系统的作用是什么&#xff1f; 达到让用户使用游戏或者软件的时候体验感更好、减少风险、方便开发者更好的找到并解决自己软件中的问题。测试好后的app可以将自己的…

C ++ 也可以搭建Web?高性能的 C++ Web 开发框架 CPPCMS + MySQL 实现快速入门案例

什么是CPPCMS&#xff1f; CppCMS 是一个高性能的 C Web 开发框架&#xff0c;专为构建快速、动态的网页应用而设计&#xff0c;特别适合高并发和低延迟的场景。其设计理念类似于 Python 的 Django 或 Ruby on Rails&#xff0c;但针对 C 提供了更细粒度的控制和更高效的性能。…

Linux--传输层协议UDP

目录 传输层 再谈端口号 端口号范围划分 认识知名端口号(Well-Know Port Number) 两个问题 UDP 协议 UDP 协议端格式 UDP 的特点 面向数据报 UDP 的缓冲区 UDP 使用注意事项 基于 UDP 的应用层协议 进一步理解UDP协议 传输层 负责数据能够从发送端传输接收端. 再谈…

STM32F407ZET6使用LCD(9341)

1.原理图 屏幕是中景园2.8寸液晶屏&#xff0c;9341驱动不带触摸屏版本 2.STM32CUBEMX配置 3.编写驱动程序

【全国大学生电子设计竞赛】2021年K题

&#x1f970;&#x1f970;全国大学生电子设计大赛学习资料专栏已开启&#xff0c;限时免费&#xff0c;速速收藏~

02 网络编程-UDP用户数据包协议

目录 一、UDP简介 二、UDP协议的通信流程 三、UDP相关API接口 &#xff08;1&#xff09;创建套接字-socket() &#xff08;2&#xff09;地址信息结构体sockaddr_in{} &#xff08;3&#xff09;地址转换接口 &#xff08;4&#xff09;发送消息sendto() &#xff08;…

谁偷偷看了你的网站?这两款统计工具告诉你!小白易上手~

前两天&#xff0c;上线了一个知识库网站&#xff1a;花了一天时间&#xff0c;搭了个专属知识库&#xff0c;终于上线了&#xff0c;手把手教&#xff0c;不信你学不会。 想知道这个网站的流量如何&#xff0c;怎么搞&#xff1f; 网站流量统计分析工具&#xff0c;了解下&a…

EmguCV学习笔记 C# 2.2 Matrix类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV学习笔记目录 Vb.net EmguCV学习笔记目录 C# 笔者的博客网址&#xff1a;VB.Net-CSDN博客 教程相关说明以及如何获得pdf教…

全面解析Gerapy分布式部署:从环境搭建到定时任务,避开Crawlab的坑

Gerapy分布式部署 搭建远程服务器的环境 装好带docker服务的系统 Docker:容器可生成镜像&#xff0c;也可拉去镜像生成容器 示例&#xff1a;将一个环境打包上传到云端(远程服务器)&#xff0c;其他8个服务器需要这个环境直接向云端拉取镜像生成容器,进而使用该环境,比如有MYS…

ElasticSearch读写性能调优

文章目录 ES写入数据过程ES读取数据的过程写数据底层原理提升集群读取性能数据建模优化分片 提升写入性能的方法服务器端优化写入性能建模时的优化降低Translog写磁盘的频率&#xff0c;但是会降低容灾能力分片设定调整Bulk 线程池和队列 ES写入数据过程 客户端选择一个node发…

Linux系统编程:进程间通信 1:管道

1.进程间的互相通信的方式 进程间互相通信的方式共有7种&#xff1a; &#xff08;1&#xff09;无名管道&#xff08;同主机&#xff09; &#xff08;2&#xff09;有名管道&#xff08;同主机&#xff09; &#xff08;3&#xff09;信号&#xff08;同主机&#xff09;…

大语言模型(LLM)构建产品的一年经验总结【干货长文】

这是一份涵盖战术、运营和战略方面的大语言模型产品成功建设的实用指南。 现在是构建大型语言模型&#xff08;LLM&#xff09;的激动人心的时刻。在过去的一年里&#xff0c;LLM已经变得足够好&#xff0c;可以用于实际应用。而且它们每年都在变得更好更便宜。伴随着社交媒体上…

成功转行软件测试工程师,年薪30W+,经验总结都在这!

这是给转行做软件测试的小白的参考&#xff0c;无论是从零开始&#xff0c;或者是转行的朋友来说&#xff0c;这都是值得一看的&#xff0c;也是可以作为一种借鉴吧。 而且我决定转行IT&#xff08;互联网&#xff09;行业&#xff0c;其实理由也很简单&#xff0c;不用动体力…

全网爆火的从零到一落地接口自动化测试

前段时间写了一系列自动化测试相关的文章&#xff0c;当然更多的是方法和解决问题的思路角度去阐述我的一些观点。结合我自己实践自动化测试的一些经验以及个人理解&#xff0c;这篇文章来聊聊新手如何从零到一落地实践接口自动化测试。 为什么要做接口测试 测试理念的演变 早…

awesome-react-native 收集最好的React Native库,工具,教程,文章(上篇)

image 分类 分类 会议 连锁反应 - 波特兰&#xff0c;或者美国React Native EU - 弗罗茨瓦夫&#xff0c;波兰React Alicante - 西班牙阿利坎特ReactNext - 以色列特拉维夫React Berlin - 柏林&#xff0c;德国 用品 参考HOWTO文档什持续集成内幕 组件 UI 导航 导航/路由文章…

Aerospike学习笔记

1 概述 Aerospike 是一个分布式、可扩展的数据库。该架构具有三个关键目标&#xff1a; 为网络规模的应用程序创建灵活、可扩展的平台。提供传统数据库所期望的稳健性和可靠性&#xff08;如 ACID&#xff09;。以最少的人工参与提供运营效率。 文档链接&#xff1a;https://d…

【Linux —— 理解pthread库和底层逻辑】

Linux —— 理解pthread库和pthread_t 理解pthread库pthread库是一个动态库底层逻辑 LWPpthread_tpthread_t的概念pthread_t 的实现pthread_t 与 LWP 的关系 独立的栈空间管理 理解pthread库 pthread库是一个动态库 使用下面指令可以查找的系统目录下的库信息 ls /lib/x86_6…