https://github.com/kuishou68/python
按照你的谷歌瀏覽器下載指定版本的驅(qū)動(dòng) http://chromedriver.storage.googleapis.com/index.html
驅(qū)動(dòng)跟兩個(gè)python腳本放入同目錄,我的版本是90.0.4430的,查看你自己的版本,下載后把我的chromedriver.exe替換掉!
這里用到了很多第三方包,鼠標(biāo)放在報(bào)紅的包名下,用Alt+Enter導(dǎo)包,如果失敗則在控制臺(tái)用下面的必殺技
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è)置編碼格式,防止后面寫入文件時(shí)報(bào)錯(cuò) friend = '1569339843' # 朋友的QQ號(hào),朋友的空間要求允許你能訪問 user = '783533896' # 你的QQ號(hào) pw = '1323mkoNJI.@' # 你的QQ密碼 # 獲取瀏覽器驅(qū)動(dòng) chrome_driver = 'chromedriver.exe' driver = webdriver.Chrome(executable_path=chrome_driver) # 瀏覽器窗口最大化 driver.maximize_window() # 瀏覽器地址定向?yàn)閝q登陸頁(yè)面 driver.get("http://i.qq.com") # 所以這里需要選中一下frame,否則找不到下面需要的網(wǎng)頁(yè)元素 driver.switch_to.frame("login_frame") time.sleep(3) # 自動(dòng)點(diǎn)擊賬號(hào)登陸方式 driver.find_element_by_id("switcher_plogin").click() time.sleep(3) # 賬號(hào)輸入框輸入已知qq賬號(hào) driver.find_element_by_id("u").send_keys(user) time.sleep(5) # 密碼框輸入已知密碼 driver.find_element_by_id("p").send_keys(pw) time.sleep(5) # 自動(dòng)點(diǎn)擊登陸按鈕 driver.find_element_by_id("login_button").click() time.sleep(5) # 讓webdriver操縱當(dāng)前頁(yè) 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 # 初始“下一頁(yè)”的id while True: # 下拉滾動(dòng)條,使瀏覽器加載出動(dòng)態(tài)加載的內(nèi)容, # 我這里是從1開始到6結(jié)束 分5 次加載完每頁(yè)數(shù)據(jù) for i in range(1, 6): height = 20000 * i # 每次滑動(dòng)20000像素 strWord = "window.scrollBy(0," + str(height) + ")" driver.execute_script(strWord) time.sleep(4) # 很多時(shí)候網(wǎng)頁(yè)由多個(gè)frame>或iframe>組成,webdriver默認(rèn)定位的是最外層的frame, # 所以這里需要選中一下說說所在的frame,否則找不到下面需要的網(wǎng)頁(yè)元素 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)到了尾頁(yè),“下一頁(yè)”這個(gè)按鈕就沒有id了,可以結(jié)束了 if driver.page_source.find('pager_next_' + str(next_num)) == -1: break # 找到“下一頁(yè)”的按鈕,因?yàn)橄乱豁?yè)的按鈕是動(dòng)態(tài)變化的,這里需要?jiǎng)討B(tài)記錄一下 driver.find_element_by_id('pager_next_' + str(next_num)).click() # “下一頁(yè)”的id next_num += 1 # 因?yàn)樵谙乱粋€(gè)循環(huán)里首先還要把頁(yè)面下拉,所以要跳到外層的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['時(shí)間'] if pd.isnull(item) | pd.isna(item): return data = item.split('年')[0] return data # 按年統(tǒng)計(jì)說說數(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)計(jì)說說點(diǎn)贊數(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)計(jì)說說評(píng)論數(shù) def readComment(result, row): item = row['評(píng)論'] 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)計(jì)每年發(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)計(jì)點(diǎn)贊和評(pí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("每年評(píng)論數(shù)", y_axis=commentValue) .add_yaxis("每年點(diǎn)贊數(shù)", y_axis=thumbValue) .render("每年點(diǎn)贊和評(píng)論折現(xiàn)圖.html") # 輸出圖形 ) paintLine()
其他代碼自行下載項(xiàng)目查看
以上就是python爬取網(wǎng)頁(yè)版QQ空間,生成各類圖表的詳細(xì)內(nèi)容,更多關(guān)于python 爬取QQ空間的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:寧夏 云南 商丘 金融催收 江蘇 定西 酒泉 龍巖
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python爬取網(wǎng)頁(yè)版QQ空間,生成各類圖表》,本文關(guān)鍵詞 python,爬取,網(wǎng)頁(yè),版,空間,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。