当前位置:   article > 正文

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战_jieba 测试文本

jieba 测试文本

目录

1 需要导入的模块

import numpy as np
import pandas as pd

import jieba
import jieba.analyse

import matplotlib.pyplot as plt

plt.style.use('seaborn')  # 改变图像风格
plt.rcParams['font.family'] = ['Arial Unicode MS', 'Microsoft Yahei', 'SimHei', 'sans-serif']  # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False  # simhei黑体字 负号乱码 解决

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2 中文分词基础步骤

2.1 载入数据

# 1 载入数据

# 写法1
with open(r'data\text.txt','r',encoding='GBk') as f:
    a = f.read()
    
# 写法2
with open('data\\text.txt','r',encoding='GBk') as f:
    a = f.read()
a
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.2 分词

  • cut() 切割
#  2 分词
b = jieba.cut(a)
b  # 得到地址:<generator object Tokenizer.cut at 0x000001AE80FFBE48>
list(b) # 列表化
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
遍历一遍

for i in jieba.cut(a):
    print(i)
  • 1
  • 2

在这里插入图片描述

  • lcut() 切割并列表化
# 分词后直接生成列表
c = jieba.lcut(a)
c
  • 1
  • 2
  • 3

在这里插入图片描述

2.3 分词后的数据转回文本

# 3 分词后的数据转回文本
d = ' '.join(c)
d
  • 1
  • 2
  • 3

在这里插入图片描述

2.4 保存分词后的文本为文本文件

#  4 保存分词后的文本为文本文件
with open(r'temp\20211022cut.txt','w',encoding='utf-8') as f:
    f.write(d)
  • 1
  • 2
  • 3

3 添加自定义词典

a = '李小福是创新办主任也是云计算专家'
a
  • 1
  • 2

在这里插入图片描述
普通分词结果

jieba.lcut(a)
  • 1

在这里插入图片描述
注意:自定义词典文本文件,如果使用Windows记事本编辑,读入Python列表时会带有文件头BOM,应该用高级编辑器去除

3.1 方法1:直接定义词典列表

# 应用自定义词典
# 注意:自定义词典文本文件,如果使用Windows记事本编辑,读入Python列表时会带有文件头BOM,应该用高级编辑器去除


# 方法1:直接定义词典列表
b = ['云计算', '创新办']

jieba.load_userdict(b)
jieba.lcut(a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

3.2 方法2:外部载入

# 3.2 方法2:外部载入
with open(r'data\custom.txt','r',encoding='utf-8') as f:
    b = f.read()
    
b = b.split('\n')
# b

jieba.load_userdict(b)
jieba.lcut(a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

  • 方法2升级:输入路径直接应用自定义词典
# 方法2升级
jieba.load_userdict('data\custom.txt')

jieba.lcut(a)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

4 动态增加或删除词典的词

# 动态增加或删除词典的词
a2 = '我们中出了一个叛徒'
jieba.lcut(a2)
  • 1
  • 2
  • 3

在这里插入图片描述

  • 两个词错误的分为1个词,删除词实现正确分词

删除jieba自带的词(不同于去停用词,不是删除词,而是重新分词)

# 两个词错误的分为1个词,删除词实现正确分词
jieba.del_word('中出') # 删除jieba自带的词(不同于去停用词,不是删除词,而是重新分词)
jieba.lcut(a2)
  • 1
  • 2
  • 3

在这里插入图片描述

  • 增加jieba的词

增加jieba的词,和自定义词典相比它可以动态增加词

# 增加jieba的词
jieba.add_word('出了')
jieba.lcut(a2)
  • 1
  • 2
  • 3

在这里插入图片描述

  • 恢复原状
# 恢复原状
jieba.add_word('中出')
jieba.del_word('出了')
jieba.lcut(a2)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

  • 调节词的词频
# 调节词的词频,使其能(或不能)被分出
# tune=True:执行词频调整,默认False不执行
jieba.suggest_freq(('中','出'),tune=True)
jieba.lcut(a2)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
调整的词以字符串形式输入

# 调整的词以字符串形式输入
jieba.suggest_freq('一个叛徒',tune=True)
jieba.lcut(a2)
  • 1
  • 2
  • 3

在这里插入图片描述
恢复jieba到原始状态

# 恢复jieba到原始状态
jieba.suggest_freq(('中出'),tune=True)
jieba.suggest_freq(('一个','叛徒'),tune=True)
jieba.lcut(a2)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

5 去停用词

  • 与上面相反,当一个字符串不是词,jieba误将其分为词,或者我们不想将某些不重要的词分出来(想删掉某些分出的词)可以自定义停用词词典
  • 停用词就是要从分词结果删掉的垃圾无用词
  • 词典中的词不会出现在分词结果中
  • 停用词词典的内容可以根据项目不断增加

原始代码

# 去停用词
a = '哎,鹅,听说你超级喜欢小游戏的!你是吗?'
a
  • 1
  • 2
  • 3

普通分词

b = jieba.lcut(a)
b
  • 1
  • 2

在这里插入图片描述

  • 去停用词功能jieba不带,需自行实现。下面是实现

先载入停用词

# 载入停用词
# 方法1:手工构造停用词列表
stopword = ['哎','的','是','你','吗','!',',', '?']

# 方式2:载入停用词文件
# with open(r'data\stopword.txt','r',encoding='utf-8') as f:
# #     print(f.read())
#     s = f.read()
    
# stopword = s.split('\n') # 会用转译字符'\\u3000','\\n'出现,需要删除

# 方式2提升,若停用词表的特殊词载入时被自动转义,可以判断并恢复
stopword = []
with open(r'data\stopword.txt','r',encoding='utf-8') as f:
    for line in f.readlines():
        l = line.strip()
        if l == '\\u3000':
            l = '\u3000'
        if l == '\\n':
            l = '\n'
        
        stopword.append(l)
        
stopword
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

特殊字符恢复成功
在这里插入图片描述

  • 去停用词,第一步,求差集
# 去停用词,第一步,求差集
x = np.array(b)
x

y = np.array(stopword)
y

# 目的:将分词数组内停用词数组有的值删除
# np.in1d(x,y)

z = x[~np.in1d(x,y)] #反运算 加“~”
z
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

  • 第二步:去掉1个字以下的词
# 第二步:去掉1个字以下的词
k = []

# 遍历写法
# for i in z:
# #     print(len(i))  #查看各个词组的字数
#     if len(i) > 1:
#         k.append(i)

# 列表生成式写法
k = [i for i in z if len(i) > 1]
k
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

5.2 精确分词和模糊分词

python使用jieba实现中文分词去停用词方法示例

1 精确模式,试图将句子最精确地切开,适合文本分析;

2 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;

3 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

seg_list1 = jieba.cut("我去过清华大学和北京大学。")

seg_list2 = jieba.cut("我去过清华大学和北京大学。", cut_all=True)

seg_list3 = jieba.cut_for_search("我去过清华大学和北京大学。")
  • 1
  • 2
  • 3
  • 4
  • 5

输出的值由于是cut方法,需要列表化输出

list(seg_list1),list(seg_list2),list(seg_list3)
  • 1

在这里插入图片描述

6 抽取文档关键词

抽取文档关键词用于在一篇文章中获取其核心内容(描述了什么?),又叫 生成摘要、打标签、关键词提取等

6.1 词频统计(词频分析)

  • 词在文本中出现的次数(频次),某种程度上能当做文本的标签,表示文本内容
  • 不是很精准
  • 统计前最好先去完成自定义词典和去停用词的前期操作

源数据

# 词频统计(词频分析)
a = '哎,鹅,听说你超级喜欢小游戏的!你是吗?哎,鹅'

# 略过自定义词典、去停用词
x = jieba.lcut(a)
x
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

  • 方法1 : 转换为Series结构
#方法1

pd.Series(x).value_counts()
  • 1
  • 2
  • 3

在这里插入图片描述

  • 方法2:转换成DataFrame结构
#方法2

pd.DataFrame(x)
# pd.DataFrame(x).value_counts() # 方法2.1
pd.DataFrame(x).groupby(0).size().sort_values(ascending=False)
  • 1
  • 2
  • 3
  • 4
  • 5

6.2 案例:分析Python互联网招聘信息中的需求关键字

载入文本数据

# 案例:分析Python互联网招聘信息中的需求关键字

# 载入文本数据
with open(r'data\work.txt','r',encoding='utf-8') as f:
    txt = f.read()
    
print(txt)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

6.2.1 方式1:使用词频方式提取关键词

  • 按3,4,5步骤走一遍
# 方式1:使用词频方式提取关键词

# 1 自定义词典
jieba.load_userdict(r'data\custom.txt') 

# 2 分词
w = jieba.lcut(txt)
w

# 3 去停用词
# 载入停用词表
stopword = []
with open(r'data\stopword.txt','r',encoding='utf-8') as f:
    for line in f.readlines():
        l = line.strip()
        if l == '\\u3000':
            l = '\u3000'
        if l == '\\n':
            l = '\n'
        
        stopword.append(l)
        
# 4 去停用词
# 第一步,求差集
x = np.array(w)
y = np.array(stopword)
z = x[~np.in1d(x,y)] # 反向求差

# 第二步,去掉1个字以下的词
k = [i for i in z if len(i) > 1]

k
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

在这里插入图片描述

  • 统计词频
# 计算词频并排序

result = pd.Series(k).value_counts()[:20]
result
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

  • 保存结果
# 保存结果
result.to_csv(r'temp\20211022keyword.csv',header=0)
  • 1
  • 2

在这里插入图片描述

  • 局限性:统计词频作为文档关键字的准确性不高,还可使用下面的方式

TF-IDF算法 Text-Rank算法 注:TF-IDF和Text-Rank算法运行都不需要手动去停用词,可以用内置函数自动去停用词

6.2.2 方式2:使用TF-IDF权重算法提取关键词(注重信息量)

TF-IDF权重:

词频和重要词的综合分数(权重)

重要词:信息量大的词
  • 1
  • 2
  • 3
  • 一个词信息量大小的衡量

在本文章出现的次数多,在通用文档库出现的次数少,就是重要词

如:你我他,你好再见 这些词信息量很小
行业专有名词,如Python/MySQL,信息量就很大
  • 1
  • 2
  • 首先,应用自定义词典
  • 然后,去除停用词,系统自带,给抽取关键字用
# 使用TF-IDF权重算法提取关键词

jieba.load_userdict('data\custom.txt')  # 应用自定义词典
jieba.analyse.set_stop_words('data\stopword.txt')  # 抽取关键词前去掉自定义停用词

txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
-不需要手动分词,方法会自动分词后抽取关键字

# 不需要手动分词,方法会自动分词后抽取关键字
jieba.analyse.extract_tags(txt)
  • 1
  • 2

在这里插入图片描述

  • 查看详细参数
# 详细参数:

# 字符串
# 返回多少关键词,默认20个
# 是否返回TF-IDF权重
# allowPOS=(),什么词性可以做抽取,默认所有词
k = jieba.analyse.extract_tags(txt,topK=30,withWeight=True)
k
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

6.2.3 方式3:Text-Rank算法(注重文本)

  • 词性标注
# 附:词性标注

a
list(jieba.posseg.cut(a))
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

# 方式3:Text-Rank算法(注重文本)

# 文本
# 显示多少词
# 是否返回关键字权重
# allowPOS=(),什么词性可以做抽取,默认所有词

t = jieba.analyse.textrank(txt,topK=20,withWeight=True,allowPOS=('ns', 'n', 'vn', 'v'))
t
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

7 词云-WordCloud

安装 WordCloud库

如系统未安装C++编译库,WordCloud库需要下载whl再使用pip安装
http://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud
命令行本地安装:pip install e:/wordcloud‑1.8.0‑cp37‑cp37m‑win_amd64.whl

7.1 案例:为《大话西游》台词节选绘制词云

需要用的库

import numpy as np
import matplotlib.pyplot as plt

import jieba
from wordcloud import WordCloud
from PIL import Image
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 数据载入、分词并转化成文本
    • 注意:不用print输出会看见换行符“\n”,例如这样
with open(r'data\大话西游.txt','r',encoding='utf-8') as f:
    txt = f.read()

# print(txt)  # 不用print输出会看见换行符“\n”
txt
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
比较稳妥的写法:

#  案例:为《大话西游》台词节选绘制词云

# 数据载入
with open(r'data\大话西游.txt','r',encoding='utf-8') as f:
    txt = f.read()

# print(txt)  # 不用print输出会看见换行符“\n”
txt2 = ' '.join(jieba.cut(txt))
print(txt2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

  • 载入停用词
# 停用词

# 方式2:载入停用词文件
with open(r'data\stopword.txt','r',encoding='utf-8') as f:
#     print(f.read())
    s = f.read()
    
stopword = s.split('\n') # 会用转译字符'\\u3000','\\n'出现,需要删除

stopword
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

  • 基本版词云
wordcloud = WordCloud(font_path=r'data\font\arial unicode ms.ttf').generate(txt2)
wordcloud

# 显示
plt.figure(figsize=(18,10))
plt.imshow(wordcloud)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

  • 词云优化
# 词云优化

wordcloud = WordCloud(
    font_path="data/font/xjlFont.fon",  # 字体,不设置则汉字乱码
    background_color='white',# 设置背景颜色
    max_words=80, # 设置最大现显示词数
    max_font_size=80, # font_size可选
    stopwords=stopword,  # 去停用词
).generate(txt2)
wordcloud

plt.figure(figsize=(18,10),dpi=72)
plt.imshow(wordcloud) # 绘制数据内的图片,双线性插值绘图 interpolation='bilinear'
plt.axis("off") # 去掉坐标轴

plt.savefig(r'temp\20211022test3.png',dpi=300,bbox_inches='tight')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

7.2 自定义背景的词云图

使用的背景

# 自定义背景的词云图
alice_mask = np.array(Image.open('data/timg.jpg'))
plt.imshow(alice_mask)
  • 1
  • 2
  • 3

在这里插入图片描述

  • 插入背景
# 词云优化

wordcloud = WordCloud(
    font_path="data/font/xjlFont.fon",  # 字体,不设置则汉字乱码
    background_color='white',# 设置背景颜色
    max_words=80, # 设置最大现显示词数
    max_font_size=80, # font_size可选
    stopwords=stopword,  # 去停用词
    mask=alice_mask #设置背景图片
).generate(txt2)
wordcloud

plt.figure(figsize=(18,10),dpi=72)
plt.imshow(wordcloud) # 绘制数据内的图片,双线性插值绘图 interpolation='bilinear'
plt.axis("off") # 去掉坐标轴

plt.savefig(r'temp\20211022test3.png',dpi=300,bbox_inches='tight') # 保存为:带有最小白边且分辨率为300DPI的PNG图片
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

8 实战之分析产品:手游《旅行青蛙》的网络推广策略

8.1 思路

  • 根据百度指数热门程度判断游戏流行时间和流行度
  • 数据获取:抓取百度新闻 旅行青蛙 (按标题或内容查询)关键字的文字标题和相关信息

8.2 资源

  • 百度指数:http://index.baidu.com/
  • 百度新闻:http://news.baidu.com/

8.3 推荐使用技术

  • 数据获取
    • 爬虫:抓取内容,百度新闻
      • 标题
      • 来源
      • 时间,精确到日
    • 数据清洗:先抓取数据保存,然后再进行清洗
      • 字符串清理规整建议使用Python原生字符串处理函数实现
      • 例如:join(),replace(),split(),remove(),append()等等
  • 非结构化数据分析
    • 分词
    • 词云
  • 结构化数据分析
    • Pandas数据预处理和数据分析
      • 分组聚合
      • 可视化

8.4 实操之数据预处理

导入可能需要的库

import time
import json

import requests
from lxml import etree

import numpy as np
import pandas as pd

from bs4 import BeautifulSoup
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

8.4.1 百度指数 数据手动录入后生成表格

  • 在百度指数中输入关键词,卡特定的时间,手动输入数据
  • 生产dataframe结构
# 百度指数 数据手动录入后生成表格

baidu = [5408,10007,17817,39514,82117,140768,298637,406072,677541,858690,839792,744390,653541,496701,390412,322492,256334,212914,180933,157411,140104,120038,125914,105679,88426,75185,66567,61036,54812,49241,42768,35784,33774,33621,34388]
# len(baidu) # 35

date = pd.date_range('2018-1-15','2018-2-18')
date.shape # 35

baidu2 = pd.DataFrame(baidu,index=date,columns=['baidu_index'])
baidu2.head()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

  • 保存数据
# 保存数据

baidu2.to_csv(r'data2/baidu_index.csv')
  • 1
  • 2
  • 3

在这里插入图片描述

  • 读取数据
# 读取数据

# parse_dates参数作用:将csv中的时间字符串转换成日期格式
baidu = pd.read_csv(r'data2/baidu_index.csv',parse_dates=['Unnamed: 0']).set_index('Unnamed: 0') 
baidu

# 将原有的索引名“Unnamed: 0”换值
baidu.index.name = 'date'

# 查看前5行和后5行数据
baidu.head().append(baidu.tail())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述

  • 检查数据类型
# 检查数据类型

# 原来第一列日期变成了索引列,只剩一行
baidu.info()
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

baidu.describe()
  • 1

在这里插入图片描述

8.4.2 百度新闻 内容数据抓取

  • 具体实施:
    • 根据百度指数热门程度直观分析,抓取百度新闻 旅行青蛙 (按时间排序,媒体网站)关键字的文字标题和相关信息,
      时间从 2018-1-15到2018-2-18日
    • 目前是(临时使用):新闻页码1-11,每页10条,一共11页(页码pn参数值为0-100)
    • 随着时间变化,新闻增加,抓取页码也应该跟着变化
起始页:https://www.baidu.com/s?wd=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&pn=0&oq=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&tn=baiduhome_pg&ie=utf-8&rsv_idx=2&rsv_pq=97f74ecb000e439a&rsv_t=203awND%2FceKGrqADsjLbpJsi0pW3tFrpcVUE23%2FtFWcPLT5Vnz80grVRZHTmbfvED9KL&gpc=stf%3D1515945600%2C1518883200%7Cstftype%3D2&tfflag=1

终止页:https://www.baidu.com/s?wd=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&pn=100&oq=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&tn=baiduhome_pg&ie=utf-8&rsv_idx=2&rsv_pq=be7a7ece000eb2a4&rsv_t=cd1cpTDUXK0oMiSFOSxFIcW08CH2acCb6aTII9RykE452zK8WubRYR059Czcuc1Zulyw&gpc=stf%3D1515945600%2C1518883200%7Cstftype%3D2&tfflag=1
  • 1
  • 2
  • 3

测试一下目标网址页数和pn值的关系是否对应

%%time
# 测试

page = 1 
url_page = (page-1) * 10
while page <= 11:
    print('url参数:',url_page,'页数:',page)
    url_page += 10
    page += 1
    time.sleep(0.2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

是有一定数量关系的
在这里插入图片描述
在这里插入图片描述

  • 锁定目标抓取数据

需要注意的小问题

  1. 抓取的数据本身如果有空格,在编译的时候会输出字符\xa0 ,使用join和split的组合方法去掉
''.join(i.get_text().split())  
# split方法输出的是列表
# join方法输出的是字符串,刚好配合起来
  • 1
  • 2
  • 3

在这里插入图片描述
想要的输出的结果:
在这里插入图片描述

  1. 使用过beautifulsoup模块下的select方法会输出特定标签下的所用文本

例如该标签下的所有文本中,仍然有标签,而且标签内还有文本,也会一个输出
在这里插入图片描述
输出的效果:时间和摘要连在了一起
在这里插入图片描述

  1. select方法会输出特定标签下的所用文本,而且输出的是列表值,如果要对select后找到的标签继续查找,可以将“这个列表”的元素抽出来继续查找

例如:
在列表后面命令输出第0个值

source = i.select('div[class="f13 c-gap-top-xsmall se_st_footer user-avatar"]')[0].select('a')[0].get_text()
  • 1

在这里插入图片描述

  1. 有时候匹配找到的标签下面没有值,但代码依然是命令赋值给对象,但原本就已经找不到,还赋值的话就会报错,如:
IndexError: list index out of range 
  • 1

解决方法是增加try except语句,如果报错就添加特定字符,如:

        try:
            date = i.select('.c-abstract')
            dict['date'].append(''.join(date[0].get_text().split()))
        except:
        
            print('空值')
            dict['date'].append(''.join('青蛙'))    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 抓取数据写法1(不建议):将所有特定标签找出来,放在对应的列表,但可能会出现标签与标签之间数据量不一样的情况,如:
    在这里插入图片描述
    由于方法存在缺陷,有些值并没有抓取。。。。。 这里仅展示部分完成的代码
%%time
# 数据抓取

data_list = [] # 创建空列表储存数据

# 请求头
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}

# 按时间顺序抓取,页码1-11的pn值为0-100
page = 1 
url_page = (page-1) * 10
while page <= 1:
    print('url参数:',url_page,'页数:',page)
#     创建空字典存储得到的数据,并将该列表添加进空列表c
    dict = {'page':page,'title':None,'source':None,'date':None,'url':None}
#     print(dict)


#     写法1
# ============================================
#     网址
    url = 'https://www.baidu.com/s?wd=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&pn={}&oq=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&tn=baiduhome_pg&ie=utf-8&rsv_idx=2&rsv_pq=97f74ecb000e439a&rsv_t=203awND%2FceKGrqADsjLbpJsi0pW3tFrpcVUE23%2FtFWcPLT5Vnz80grVRZHTmbfvED9KL&gpc=stf%3D1515945600%2C1518883200%7Cstftype%3D2&tfflag=1'.format(url_page)
#     得到响应并解码
    res = requests.get(url,headers=headers).content.decode()
#     print(res)
#     转类型
    soup = BeautifulSoup(res,'lxml')
#     print(soup)

#     匹配
#     1 匹配标题
    title = soup.select('.t')
#     print(len(title))
    dict['title'] = [i.get_text() for i in title]
#     添加进字典
    
    print('标题个数:',len(dict['title']))
    
#     2 匹配摘要
    date = soup.select('.c-abstract')
#     print(len(date))
#     print(date)
#     摘要部分包含了时间,但时间后面带了一个空格,
# 在编译的时候会输出字符\xa0 ,使用join和split的组合方法去掉
    dict['date'] = [''.join(i.get_text().split()) for i in date]
#     print(dict['date'])
    print('摘要个数:',len(dict['date']))
    
#     3 匹配时间
    t = soup.select('span[class="newTimeFactor_before_abs c-color-gray2 m"]')
#     print(t)
    dict['time'] = [''.join(i.get_text().split()) for i in t]
#     print(dict['time'])
    print('时间个数:',len(dict['time']))
    
    print('第{}页'.format(str(page)))
    print(dict)
    print('===========================')
    print('===========================')
    
    
    
    url_page += 10
    page += 1
    time.sleep(0.2)
    
# 由于方法存在缺陷,有些值并没有抓取。。。。。    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

得到的数据其实并不相等,而且随着页数的增加,更难去手动添加,对于这个问题,推荐使用方法2
在这里插入图片描述

  • 爬取方法2(推荐):匹配每一个文章块标签(包含了每个部分想找的东西的标
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/140814?site
推荐阅读
相关标签
  

闽ICP备14008679号