目录
📚链接爬取
🐇流程梳理
-
总体流程 是:构建搜索链接 -> 发送HTTP请求 -> 解析网页内容 -> 提取标题和链接 -> 判断重复 -> 写入csv工作表 -> 保存csv工作簿。
-
循环遍历100页(暂定,实现翻页)的搜索结果,完成全部数据的提取和保存。
-
key :在百度搜索结果页面中,通常每个搜索结果都包含在一个<h3>标签内,并具有一个特定的CSS类名为"t"。
🐇代码实现
python
# 发送HTTP请求并处理URL
import urllib
from urllib import request, parse
# 管理和处理HTTP请求和响应中的Cookie信息
import http.cookiejar
# 解析和提取HTML/XML数据
from bs4 import BeautifulSoup
# 读取和编辑数据
import openpyxl
import random
import time
# 随机等待时间的函数
# 避免以高频率向服务器发送请求造成宕机
def random_wait():
# 生成一个随机的等待时间,范围为1到5秒
wait_time = random.uniform(1, 5)
time.sleep(wait_time)
# 创建一个新的Excel工作簿对象
workbook = openpyxl.Workbook()
# 返回工作簿中的活动工作表对象,表明之后的代码对这个工作表进行操作
worksheet = workbook.active
# 添加标题
worksheet.append(
['Titles', 'Links'])
# 标题集合,用于之后重复标题的处理
titles_set = set()
word = input("请输入搜索的关键词:")
for page in range(1, 101):
print("现在是第" + str(page) + "页")
# quote()函数用于将字符串进行URL编码
link = "http://www.baidu.com/s?wd="+urllib.parse.quote(word)
url = f"{link}?page={page}"
headers = {"Accept": "text/html, application/xhtml+xml, image/jxr, */*",
"Accept - Encoding": "gzip, deflate, br",
"Accept - Language": "zh - CN",
"Connection": "Keep - Alive",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0",
# 请求的来源页面
"referer": "baidu.com"}
# 创建一个CookieJar对象,用于保存网站返回的Cookie信息。
Cookie = http.cookiejar.CookieJar()
# 创建一个opener对象,使用CookieJar处理器来处理Cookie,实现Cookie的自动管理。
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(Cookie))
# 将headers字典中的键值对转化为元组,并添加到headall列表中。
pairs = []
for key, value in headers.items():
item = (key, value)
pairs.append(item)
# 将pairs列表设置为opener的请求头
opener.addheaders = pairs
# 将opener安装为全局默认的urlopen()函数的opener。
urllib.request.install_opener(opener)
# 发送请求并获取网页内容。
data = urllib.request.urlopen(url).read().decode('utf-8')
# 解析网页内容,生成BeautifulSoup对象。
soup = BeautifulSoup(data, 'html.parser')
# 查找名为'h3',class属性为't'的HTML元素
# 在百度搜索结果页面中,通常每个搜索结果都包含在一个<h3>标签内,并具有一个特定的CSS类名为"t"。
for result_table in soup.find_all('h3', class_='t'):
# 调用等待时间函数,防止宕机
random_wait()
a_click = result_table.find("a")
# 获取标题
title = a_click.get_text()
# 获取链接
link = str(a_click.get("href"))
# 如果标题已经存在于集合中,跳过此条记录,而且不要视频大全
if title in titles_set or "视频大全" in title:
continue
# 将标题添加到集合中
titles_set.add(title)
print("标题:" + title) # 标题
print("链接:" + link) # 链接
worksheet.append([title, link])
workbook.save('AI换脸_法律_案件.csv')
🐇结果
- 关键词设置为:AI换脸 法律 案件
📚词云生成
🐇代码实现
- 用爬取的全部标题来构建词云
python
# coding:utf-8
import jieba # 导入分词库
import collections # 导入collections库,用于词频统计
import wordcloud # 导入生成词云图的库
import matplotlib.pyplot as plt # 导入绘图库
# 打开文件
with open(r"AI换脸_法律_案件.txt", encoding='utf-8') as f:
data = f.read()
# 使用jieba库进行分词,默认精确模式
w_cut = jieba.cut(data, cut_all=False)
# 存储分词结果的列表
word_list = []
# 设置排除词
word_remove = [u',', u' ', u'。', u'、', u'\n', u'', u'(', u')', u'"', u'"', u',', u'!', u'?', u'【', u'】', u'...', u'_', u':', '|', '-', u'的', u'是', u'了', u'我', u'我们', u'腾讯', u'哔哩', u'百度', u'新浪', u'你', u'又', u'被', u'他', u'谁', u'人']
# 遍历分词结果,过滤掉排除词,将有效词添加到word_list中
for x in w_cut:
if x not in word_remove:
word_list.append(x)
# 使用Counter进行词频统计
word_counts = collections.Counter(word_list)
# 取出词频最高的前50个词
word_counts_top50 = word_counts.most_common(50)
# 打印出前50个词云及对应数量
print(word_counts_top50)
# 将词频结果转换为字符串形式
word_counts_top50 = str(word_counts_top50)
w = wordcloud.WordCloud(
# 设置词云生成时的中文字体
font_path='C:\Windows\Fonts\STKAITI.TTF',
# 设置词云的背景颜色为白色
background_color='white',
# 设置词云图片的宽度
width=700,
# 设置词云图片的高度
height=600,
# 设置词云中显示的最大字体大小
max_font_size=180
)
# 根据词频生成词云图
w.generate_from_frequencies(word_counts)
# 创建一个绘图窗口
plt.figure(1, figsize=(10, 8))
# 显示词云图
plt.imshow(w)
# 不显示坐标轴
plt.axis("off")
# 展示图表
plt.show()
# 将词云图保存为图片文件
w.to_file("wordcloud_input.png")
- 关于jieba.cut:除了 cut_all = False,jieba库还支持以下模式:
- cut_all = True:全模式,将文本中的所有可能是词的部分都进行分词,可能会产生冗余和不常见的词。
- cut_for_search = True:搜索引擎模式,将文本中可能是词的部分进行分词,同时使用了较多的细粒度切分,适用于搜索引擎构建索引或相关场景。
- HMM =True:开启隐式马尔可夫模型(Hidden Markov Model),用于在未登录词(out-of-vocabulary,OOV)的情况下进行中文分词,适用于处理未登录词较多的场景。
- 关于字体设置:font_path='C:\Windows\Fonts\STKAITI.TTF',在控制面板 -> 外观与个性化 -> 字体处,可以找到心仪字体。
🐇结果
补报错杂货铺: