目錄
??鏈接爬取
??流程梳理
??代碼實現(xiàn)
??結(jié)果
??詞云生成
??代碼實現(xiàn)
??結(jié)果
??鏈接爬取
??流程梳理
-
總體流程是:構(gòu)建搜索鏈接 -> 發(fā)送HTTP請求 -> 解析網(wǎng)頁內(nèi)容 -> 提取標題和鏈接 -> 判斷重復 -> 寫入csv工作表 -> 保存csv工作簿。
-
循環(huán)遍歷100頁(暫定,實現(xiàn)翻頁)的搜索結(jié)果,完成全部數(shù)據(jù)的提取和保存。
-
key:在百度搜索結(jié)果頁面中,通常每個搜索結(jié)果都包含在一個<h3>標簽內(nèi),并具有一個特定的CSS類名為"t"。
??代碼實現(xiàn)
# 發(fā)送HTTP請求并處理URL
import urllib
from urllib import request, parse
# 管理和處理HTTP請求和響應中的Cookie信息
import http.cookiejar
# 解析和提取HTML/XML數(shù)據(jù)
from bs4 import BeautifulSoup
# 讀取和編輯數(shù)據(jù)
import openpyxl
import random
import time
# 隨機等待時間的函數(shù)
# 避免以高頻率向服務器發(fā)送請求造成宕機
def random_wait():
# 生成一個隨機的等待時間,范圍為1到5秒
wait_time = random.uniform(1, 5)
time.sleep(wait_time)
# 創(chuàng)建一個新的Excel工作簿對象
workbook = openpyxl.Workbook()
# 返回工作簿中的活動工作表對象,表明之后的代碼對這個工作表進行操作
worksheet = workbook.active
# 添加標題
worksheet.append(
['Titles', 'Links'])
# 標題集合,用于之后重復標題的處理
titles_set = set()
word = input("請輸入搜索的關(guān)鍵詞:")
for page in range(1, 101):
print("現(xiàn)在是第" + str(page) + "頁")
# quote()函數(shù)用于將字符串進行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"}
# 創(chuàng)建一個CookieJar對象,用于保存網(wǎng)站返回的Cookie信息。
Cookie = http.cookiejar.CookieJar()
# 創(chuàng)建一個opener對象,使用CookieJar處理器來處理Cookie,實現(xiàn)Cookie的自動管理。
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(Cookie))
# 將headers字典中的鍵值對轉(zhuǎn)化為元組,并添加到headall列表中。
pairs = []
for key, value in headers.items():
item = (key, value)
pairs.append(item)
# 將pairs列表設(shè)置為opener的請求頭
opener.addheaders = pairs
# 將opener安裝為全局默認的urlopen()函數(shù)的opener。
urllib.request.install_opener(opener)
# 發(fā)送請求并獲取網(wǎng)頁內(nèi)容。
data = urllib.request.urlopen(url).read().decode('utf-8')
# 解析網(wǎng)頁內(nèi)容,生成BeautifulSoup對象。
soup = BeautifulSoup(data, 'html.parser')
# 查找名為'h3',class屬性為't'的HTML元素
# 在百度搜索結(jié)果頁面中,通常每個搜索結(jié)果都包含在一個<h3>標簽內(nèi),并具有一個特定的CSS類名為"t"。
for result_table in soup.find_all('h3', class_='t'):
# 調(diào)用等待時間函數(shù),防止宕機
random_wait()
a_click = result_table.find("a")
# 獲取標題
title = a_click.get_text()
# 獲取鏈接
link = str(a_click.get("href"))
# 如果標題已經(jīng)存在于集合中,跳過此條記錄,而且不要視頻大全
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')
??結(jié)果
- 關(guān)鍵詞設(shè)置為:AI換臉 法律 案件
??詞云生成
??代碼實現(xiàn)
- 用爬取的全部標題來構(gòu)建詞云
# coding:utf-8
import jieba # 導入分詞庫
import collections # 導入collections庫,用于詞頻統(tǒng)計
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)
# 存儲分詞結(jié)果的列表
word_list = []
# 設(shè)置排除詞
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'人']
# 遍歷分詞結(jié)果,過濾掉排除詞,將有效詞添加到word_list中
for x in w_cut:
if x not in word_remove:
word_list.append(x)
# 使用Counter進行詞頻統(tǒng)計
word_counts = collections.Counter(word_list)
# 取出詞頻最高的前50個詞
word_counts_top50 = word_counts.most_common(50)
# 打印出前50個詞云及對應數(shù)量
print(word_counts_top50)
# 將詞頻結(jié)果轉(zhuǎn)換為字符串形式
word_counts_top50 = str(word_counts_top50)
w = wordcloud.WordCloud(
# 設(shè)置詞云生成時的中文字體
font_path='C:\Windows\Fonts\STKAITI.TTF',
# 設(shè)置詞云的背景顏色為白色
background_color='white',
# 設(shè)置詞云圖片的寬度
width=700,
# 設(shè)置詞云圖片的高度
height=600,
# 設(shè)置詞云中顯示的最大字體大小
max_font_size=180
)
# 根據(jù)詞頻生成詞云圖
w.generate_from_frequencies(word_counts)
# 創(chuàng)建一個繪圖窗口
plt.figure(1, figsize=(10, 8))
# 顯示詞云圖
plt.imshow(w)
# 不顯示坐標軸
plt.axis("off")
# 展示圖表
plt.show()
# 將詞云圖保存為圖片文件
w.to_file("wordcloud_input.png")
-
關(guān)于jieba.cut:除了 cut_all = False?,jieba庫還支持以下模式:
- cut_all = True?:全模式,將文本中的所有可能是詞的部分都進行分詞,可能會產(chǎn)生冗余和不常見的詞。
- cut_for_search = True?:搜索引擎模式,將文本中可能是詞的部分進行分詞,同時使用了較多的細粒度切分,適用于搜索引擎構(gòu)建索引或相關(guān)場景。
- HMM =True?:開啟隱式馬爾可夫模型(Hidden Markov Model),用于在未登錄詞(out-of-vocabulary,OOV)的情況下進行中文分詞,適用于處理未登錄詞較多的場景。
- 關(guān)于字體設(shè)置:font_path='C:\Windows\Fonts\STKAITI.TTF',在控制面板 -> 外觀與個性化 -> 字體處,可以找到心儀字體。
?
??結(jié)果
?補報錯雜貨鋪:文章來源:http://www.zghlxwxcb.cn/news/detail-740082.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-740082.html
到了這里,關(guān)于爬蟲 | 【實踐】百度搜索鏈接爬取,生成標題詞云 | 以“AI換臉”為例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!