python爬取網(wǎng)頁版QQ空間,生成各類圖表
github源碼地址:
https://github.com/kuishou68/python
各類圖表的實現(xiàn)效果

爬取的說說內(nèi)容

個性化說說內(nèi)容詞云圖

每年發(fā)表說說總數(shù)柱狀圖、每年點贊和評論折線圖

7天好友動態(tài)柱狀圖、餅圖

使用方法
按照你的谷歌瀏覽器下載指定版本的驅(qū)動 http://chromedriver.storage.googleapis.com/index.html


驅(qū)動跟兩個python腳本放入同目錄,我的版本是90.0.4430的,查看你自己的版本,下載后把我的chromedriver.exe替換掉!

這里用到了很多第三方包,鼠標(biāo)放在報紅的包名下,用Alt+Enter導(dǎo)包,如果失敗則在控制臺用下面的必殺技
pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

主要代碼
qq空間txt.py
import time
from selenium import webdriver
from lxml import etree
# 這里一定要設(shè)置編碼格式,防止后面寫入文件時報錯
friend = '1569339843' # 朋友的QQ號,朋友的空間要求允許你能訪問
user = '783533896' # 你的QQ號
pw = '1323mkoNJI.@' # 你的QQ密碼
# 獲取瀏覽器驅(qū)動
chrome_driver = 'chromedriver.exe'
driver = webdriver.Chrome(executable_path=chrome_driver)
# 瀏覽器窗口最大化
driver.maximize_window()
# 瀏覽器地址定向為qq登陸頁面
driver.get("http://i.qq.com")
# 所以這里需要選中一下frame,否則找不到下面需要的網(wǎng)頁元素
driver.switch_to.frame("login_frame")
time.sleep(3)
# 自動點擊賬號登陸方式
driver.find_element_by_id("switcher_plogin").click()
time.sleep(3)
# 賬號輸入框輸入已知qq賬號
driver.find_element_by_id("u").send_keys(user)
time.sleep(5)
# 密碼框輸入已知密碼
driver.find_element_by_id("p").send_keys(pw)
time.sleep(5)
# 自動點擊登陸按鈕
driver.find_element_by_id("login_button").click()
time.sleep(5)
# 讓webdriver操縱當(dāng)前頁
driver.switch_to.default_content()
time.sleep(5)
# 跳到說說的url, friend你可以任意改成你想訪問的空間
driver.get("http://user.qzone.qq.com/" + friend + "/311")
time.sleep(5)
next_num = 0 # 初始“下一頁”的id
while True:
# 下拉滾動條,使瀏覽器加載出動態(tài)加載的內(nèi)容,
# 我這里是從1開始到6結(jié)束 分5 次加載完每頁數(shù)據(jù)
for i in range(1, 6):
height = 20000 * i # 每次滑動20000像素
strWord = "window.scrollBy(0," + str(height) + ")"
driver.execute_script(strWord)
time.sleep(4)
# 很多時候網(wǎng)頁由多個<frame>或<iframe>組成,webdriver默認(rèn)定位的是最外層的frame,
# 所以這里需要選中一下說說所在的frame,否則找不到下面需要的網(wǎng)頁元素
driver.switch_to.frame("app_canvas_frame")
selector = etree.HTML(driver.page_source)
divs = selector.xpath('//*[@id="msgList"]/li/div[3]')
# 這里使用 a 表示內(nèi)容可以連續(xù)不清空寫入
with open('qq_word.txt', 'a', encoding="utf-8") as f:
for div in divs:
qq_name = div.xpath('./div[2]/a/text()')
qq_content = div.xpath('./div[2]/pre/text()')
qq_time = div.xpath('./div[4]/div[1]/span/a/text()')
qq_praise = div.xpath('./div[4]/div[2]/span/span/a[2]/text()')
qq_comment = div.xpath('./div[4]/div[2]/a[3]/text()')
qq_name = qq_name[0] if len(qq_name) > 0 else ''
qq_content = qq_content[0] if len(qq_content) > 0 else ''
qq_content = qq_content.replace('\n', ' ')
qq_time = qq_time[0] if len(qq_time) > 0 else ''
qq_praise = qq_praise[0] if len(qq_praise) > 0 else ''
qq_comment = qq_comment[0] if len(qq_comment) > 0 else ''
print(qq_name, qq_time, qq_content, qq_praise, qq_comment)
f.write(qq_content + "\n")
# 當(dāng)已經(jīng)到了尾頁,“下一頁”這個按鈕就沒有id了,可以結(jié)束了
if driver.page_source.find('pager_next_' + str(next_num)) == -1:
break
# 找到“下一頁”的按鈕,因為下一頁的按鈕是動態(tài)變化的,這里需要動態(tài)記錄一下
driver.find_element_by_id('pager_next_' + str(next_num)).click()
# “下一頁”的id
next_num += 1
# 因為在下一個循環(huán)里首先還要把頁面下拉,所以要跳到外層的frame上
driver.switch_to.parent_frame()
# 關(guān)閉瀏覽器
driver.quit()
各種圖表的生成
import pandas as pd
from pyecharts.charts import Bar
from pyecharts.charts import Pie
import pyecharts.options as opts
from pyecharts.charts import Line
import re
df_excel = pd.read_excel('qq_excel.xlsx') # 默認(rèn)讀取sheet=0 Pandas DataFrame'
def getTimeStr(row):
item = row['時間']
if pd.isnull(item) | pd.isna(item):
return
data = item.split('年')[0]
return data
# 按年統(tǒng)計說說數(shù)量
def readCount(result, row):
timeData = getTimeStr(row)
if timeData == None: return
if timeData in result.keys():
result[timeData] += 1
else:
result[timeData] = 1
# 按年統(tǒng)計說說點贊數(shù)
def readThumb(result, row):
item = row['贊']
if pd.isnull(item):
return
# data = re.match(r'贊\((\d+).*', item, re.M | re.I)
if len(item.split("(")) <= 1:
return
data = item.split("(")[1].split(")")[0]
timeData = getTimeStr(row)
if timeData == None: return
if timeData in result.keys():
result[timeData] += int(data)
else:
result[timeData] = int(data)
# 按年統(tǒng)計說說評論數(shù)
def readComment(result, row):
item = row['評論']
if pd.isnull(item):
return
# data = re.match(r'贊\((\d+).*', item, re.M | re.I)
if len(item.split("(")) <= 1:
return
data = item.split("(")[1].split(")")[0]
timeData = getTimeStr(row)
if timeData == None: return
if timeData in result.keys():
result[timeData] += int(data)
else:
result[timeData] = int(data)
def readExcel(df_excel):
count = {}
result = {}
thumb = {}
comment = {}
for index, row in df_excel.iterrows():
readCount(count, row)
readThumb(thumb, row)
readComment(comment, row)
result['count'] = count
result['thumb'] = thumb
result['comment'] = comment
return result
def getKeyAndVal(keyWord):
data = readExcel(df_excel).get(keyWord)
key = []
value = []
for item in data.keys():
key.append(item)
value.append(data[item])
key.reverse()
value.reverse()
return [key, value]
# 統(tǒng)計每年發(fā)表說說次數(shù)柱狀圖
def paintBar():
count = readExcel(df_excel).get('count')
# V1 版本開始支持鏈?zhǔn)秸{(diào)用
data = getKeyAndVal('count')
print(data[0])
d = (
Bar()
.add_xaxis(data[0])
.add_yaxis("每年發(fā)表說說總數(shù)", data[1])
.render("每年發(fā)表說說總數(shù)柱狀圖.html")
)
paintBar()
# 統(tǒng)計點贊和評論折線圖
def paintLine():
commentData = getKeyAndVal('comment')
thumbData = getKeyAndVal('thumb')
xaxis_data = commentData[0]
commentValue = commentData[1]
thumbValue = thumbData[1]
d = (
Line()
.add_xaxis(xaxis_data=xaxis_data)
.add_yaxis("每年評論數(shù)", y_axis=commentValue)
.add_yaxis("每年點贊數(shù)", y_axis=thumbValue)
.render("每年點贊和評論折現(xiàn)圖.html") # 輸出圖形
)
paintLine()
其他代碼自行下載項目查看
以上就是python爬取網(wǎng)頁版QQ空間,生成各類圖表的詳細(xì)內(nèi)容,更多關(guān)于python 爬取QQ空間的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何用Anaconda搭建虛擬環(huán)境并創(chuàng)建Django項目
在本篇文章里小編給大家整理了關(guān)于如何用Anaconda搭建虛擬環(huán)境并創(chuàng)建Django項目的相關(guān)文章,需要的朋友們可以跟著學(xué)習(xí)下。2020-08-08
使用Python一鍵提取PDF中的表格到Excel的方法詳解
從PDF文件獲取表格中的數(shù)據(jù),也是日常辦公容易涉及到的一項工作,一個一個復(fù)制吧,效率確實太低了,用Python從PDF文檔中提取表格數(shù)據(jù),并寫入Excel文件,灰?;页8咝?本文就給大家介紹一下如何使用Python一鍵提取PDF中的表格到Excel,需要的朋友可以參考下2023-08-08
python如何標(biāo)準(zhǔn)化日期時間格式轉(zhuǎn)化成非標(biāo)準(zhǔn)化格式
這篇文章主要介紹了python如何標(biāo)準(zhǔn)化日期時間格式轉(zhuǎn)化成非標(biāo)準(zhǔn)化格式問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
python GUI庫圖形界面開發(fā)之PyQt5布局控件QVBoxLayout詳細(xì)使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5布局控件QVBoxLayout詳細(xì)使用方法與實例,需要的朋友可以參考下2020-03-03
pytorch從csv加載自定義數(shù)據(jù)模板的操作
這篇文章主要介紹了pytorch從csv加載自定義數(shù)據(jù)模板的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Python中的xml與dict的轉(zhuǎn)換方法詳解
這篇文章主要介紹了Python中的xml與dict的轉(zhuǎn)換方法詳解,xml 是指可擴(kuò)展標(biāo)記語言,一種標(biāo)記語言類似html,作用是傳輸數(shù)據(jù),而且不是顯示數(shù)據(jù)。可以自定義標(biāo)簽,需要的朋友可以參考下2023-07-07
Python+OpenCV實現(xiàn)圖像融合的原理及代碼
這篇文章主要介紹了Python+OpenCV實現(xiàn)圖像融合的原理及代碼,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2018-12-12

