目標
利用PYTHON爬取如下圖中所有回答的內容,并且制作詞云圖。
用到的庫
import requests
# import json
python爬取豆瓣影評、from PIL import Image
from pyquery import PyQuery as pq
from requests import RequestException
import csv
from wordcloud import WordCloud, STOPWORDS
import numpy as np
python爬取網頁,# import matplotlib.pyplot as plt
import jieba
import re
需要確保已經安裝好以上幾個常用的庫。具體的操作直接 pip install xxx?就好了,推薦使用國內源安裝,具體的請看我的另一篇博客https://blog.csdn.net/qq_41655933/article/details/89637657
話不多說,開始操作!
爬蟲階段
python 豆瓣。1.?獲取網頁源碼
首先我們要爬取的網址是https://www.douban.com/group/topic/82916031/?start=0
點看第二面?https://www.douban.com/group/topic/82916031/?start=100
發現start變為了100。這樣以來,爬取就有規律了。只要每次爬取一個頁面,使start值加100就ok了。
于是寫出以下代碼。
def get_one(page):
python爬蟲網頁,"""
爬取一頁
:param page: start數
:return: html源碼
"""
try:
爬蟲爬取數據、headers = {
# 'Cookie': 'bid=kCNfNn6nvxA; __utmz=30149280.1564815097.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __yadk_uid=CvRkxvch6yW4IwpqONlyGzPCB1GznXLV; douban-fav-remind=1; ap_v=0,6.0; _pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1568964489%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D2p9zSFnHJuYwVjtaUY6Smc_R8lvOe0b5EatQr75zQywo5qIDZ1s5EUIST8Jw0K3qpAoQXJLWDJHTyx6jNbRq-a9MIbUXwkq4V8vrhxYGdqO%26wd%3D%26eqid%3Dd4a8230500089ac3000000055d452e46%22%5D; _pk_id.100001.8cb4=ef75a07b06bad72b.1564815095.2.1568964489.1564815095.; _pk_ses.100001.8cb4=*; __utma=30149280.546149049.1564815097.1564815097.1568964491.2; __utmc=30149280; __utmt=1; __utmb=30149280.3.8.1568964491',
'Host': 'www.douban.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', # 瀏覽器標識
}
url = 'https://www.douban.com/group/topic/82916031/?start={}'.format(page) # url
python爬蟲教程、response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
except RequestException:
return None
2.?解析HTML
我們在瀏覽器中,右擊網頁點擊‘檢查’選項,進入開發者模式。我們可在elements找到我們想要找到的對象,如下圖
python有什么用。藍色區域就是我們想要爬取的對象。此處解析要用到pyquery,用css選擇器表示該對象的路徑為:#comments li .reply-doc。
def parse_one(html):
"""
解析一頁源碼
:param html:html源碼
:return:返回生成器,用于迭代
qpython,"""
doc = pq(html) # 初始化
items = doc('#comments li .reply-doc').items() # css選擇器選擇所有該標簽
# print(items.size()) # 評論的個數
for item in items:
yield {
python爬取豆瓣電影top250。'name': item.find('h4 a').text(), # 用戶名
'address': item.find('h4 a').attr('href'), # 用戶主頁
# 'signature': item.find('h4').text(), # 個性簽名
'time': item.find('h4 span').text(), # 回復時間
'reply': item.find('p').text(), # 回復內容
'quote-reply': item.find('.reply-quote .short').text(), # 引用的回復內容
python為什么叫爬蟲、'quote-user': item.find('.reply-quote .pubdate').text(), # 引用的用戶名
'quote-user-addr': str(item.find('.reply-quote .pubdate a').attr('href')).strip() if item.find('.reply-quote .pubdate a').attr('href') else '', # 引用的用戶的主頁
# 'vote': item.find('.comment-vote').text() # 贊
}
至此,用上面兩個函數就可以?利用for循環?將每一頁的內容可以爬取下來了。
現在,我們還需要將結果保存下來。
python爬取豆瓣電影并分析,3.?保存數據到csv文件
def write_csv(contents):
"""
寫入數據到csv文件
:param contents: 解析的內容,可迭代
:return:
python簡單爬蟲代碼、"""
with open('douban.csv', 'a', encoding='utf-8') as f: # 追加方式寫數據
fieldnames = ['name', 'address', 'time', 'reply', 'quote-reply', 'quote-user', 'quote-user-addr'] # 第一行
write = csv.DictWriter(f, fieldnames=fieldnames, lineterminator='\n') # 消除多余的換行,不加lineterminator會出現每寫一行空一行的情況。
write.writeheader()
for content in contents:
用python爬取網站數據?print(type(content))
write.writerow(content)
同樣的,我們還需要寫一個讀取csv文件的函數,以便將所有的回復讀取出來
4.?讀取csv文件
def read_csv():
"""
利用python進行數據分析豆瓣?將回復的內容保存在列表中并返回
:return:
"""
reply = []
n = 0
with open('douban.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
if row[4] != 'quote-reply':
reply.append(row[3])
return reply
5.執行代碼
到這里,爬蟲階段結束。我們還要執行以下代碼段以保存所有數據:
for i in range(15):
write_csv(parse_one(get_one(i * 100)))
查看保存的文件:
詞云圖階段
1.分詞
因為wordcloud對中文的分詞不友好,所以我們在這里使用jieba分詞。結巴分詞各位同學可以在github上查看它的介紹,鏈接如下https://github.com/fxsjy/jieba
def text_chinese():
"""
利用jieba進行中文分詞
:return: 分詞后的字符串
"""
t = read_csv() # 讀取回復內容
text = ''.join(t) # 列表拼接成字符串
text = re.sub('[a-zA-Z0-9\s\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\'\:\;\'\,\[\]\.\\/\?\~\。\@\#\\\&\*\%]+', '', text) # 利用正則表達式,去除字符串中的數字英文等字符。
jieba_list = jieba.cut(text) # jieba給字符串分詞,得到分詞列表
word_list = ' '.join(jieba_list) # 將分詞列表,用空格連接成字符串
print(word_list)
return word_list
2.wordcloud 制作詞云圖
準備工作做完了,接下來只需要利用wordcloud生成詞云圖就完事了。
wordcloud參數含義可參考?https://www.cnblogs.com/delav/articles/7837975.html
# 生成詞云圖
# con = jieba.cut('jieba是什么東西')
# words = ' '.join(con)
# print(words)
words = text_chinese() # 分詞后的字符串
font = r'?C:\Windows\Fonts\msyh.ttc' # 字體路徑
stopword = set(STOPWORDS) #設置停用詞,STOPWORDS為wordcloud自帶的英文停用詞,其他的可以自己添加。
stopword.add('謝謝')
stopword.update({'可以', '謝謝', '樓主', '希望', '中文名', '英文名', '名字'})
# 圖片模板 在這里博主設置的圖片為湖北地圖。
image = np.array(Image.open('hubei.jpg'))
wc = WordCloud(font_path=font, # 中文必須設置字體,不然圖片會顯示方框
background_color='white', # 背景為白色
# width=800, # 畫布寬度
# height=800, # 畫布高度
mask=image, # 圖片模版,wordcloud會在圖片中非白色的那塊填充文字。若有該參數則忽略設置的寬高值。
scale=5, # 按照比例放大畫布
stopwords=stopword) # 停用詞
wc.generate(words) # 根據文本生成詞云
wc.to_file('wordCloud.png') # 保存圖片
ima = wc.to_image() # 顯示圖片
ima.show()
# plt.imshow(wc) # 用plt顯示圖片
# plt.axis('off') # 設置坐標軸不可見
# plt.show() # 顯示圖片
結束
運行以上代碼可以在當前文件夾查看已經生成好的詞云圖。
同學們學會了嗎?
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态