python爬取qq空间说说
生活随笔
收集整理的這篇文章主要介紹了
python爬取qq空间说说
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
模塊:selenium,pyquery,json,time
使用的是:Chrome
遇到的問題:
對空間的登陸進行分析
進入網(wǎng)址:https://i.qq.com/
說說地址:https://user.qzone.qq.com/{qq}/311
我模擬點擊這個頭像,也可以點擊賬號密碼登陸,然后填充。
對頭像點擊右鍵檢查審查元素
我們可以模擬點擊這個標簽的id進行模擬操作
在模擬登陸的時候:
對說說進行分析
思路是:首先尋找說說有幾頁,然后在進行每頁的跳轉(zhuǎn)
這里就是說說的內(nèi)容,發(fā)現(xiàn)這里也是一個frame,所以要進入,然后判斷說說有幾頁。
對說說內(nèi)容進行分析
def get_page_text(n):try:doc = pq(browser.page_source) # 獲取頁面的htmlitems = doc('#msgList > li.feed').items() # 獲取所有的說說for item in items: # 對說說進行分開yield {'time': item.find('div.box.bgr3 > div.ft > div.info > .c_tx3 > .c_tx').text(),'text': item.find('.content').text().lstrip('?\n')}text = wait.until(EC.presence_of_element_located((By.ID, f'pager_go_{n-1}'))) # 獲取跳轉(zhuǎn)頁的輸入框text.send_keys(n+1) # 輸入下一頁text.send_keys(Keys.ENTER) #進行確定except:browser.close()一開始模擬的點擊下一頁來進行爬去,但是遇到的問題是,
所以換取了思路,進行跳轉(zhuǎn)頁的點擊,知道了這一點以后,遇到爬頁面的點擊就不要模擬點擊下一頁了。
爬取的格式:
完整的代碼
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from pyquery import PyQuery as pq import time import jsonoptions = webdriver.ChromeOptions() # 設置無圖模式 prefs = {'profile.default_content_setting_values': {'images': 2} } options.add_argument('--headless') # 瀏覽器隱藏 options.add_argument('--disable-gpu') options.add_experimental_option('prefs', prefs) #設置無圖模式 browser = webdriver.Chrome(chrome_options=options) wait = WebDriverWait(browser, 5)def get_last_page(qq):try:url = f'https://user.qzone.qq.com/{qq}/311'browser.get(url)try:browser.find_element(By.NAME, 'login_frame') # 發(fā)現(xiàn)登陸的frameexcept:raiseelse:try:browser.switch_to_frame('login_frame') # 發(fā)現(xiàn)之后進入login_framelogin = wait.until(EC.element_to_be_clickable((By.ID, 'img_out_1290259791'))) # 獲取點擊按鈕 也可以進行輸入賬號密碼login.click() # 進行點擊except Exception as e:raisetime.sleep(2)browser.switch_to_frame('app_canvas_frame') # 進入switch_to_framepage_last = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#pager_last_0 > span'))).text # 最后一頁return int(page_last)except Exception:get_last_page(qq)def get_page_text(n):try:doc = pq(browser.page_source) # 獲取頁面的htmlitems = doc('#msgList > li.feed').items() # 獲取所有的說說for item in items: # 對說說進行分開yield {'time': item.find('div.box.bgr3 > div.ft > div.info > .c_tx3 > .c_tx').text(),'text': item.find('.content').text().lstrip('?\n')}text = wait.until(EC.presence_of_element_located((By.ID, f'pager_go_{n-1}'))) # 獲取跳轉(zhuǎn)頁的輸入框text.send_keys(n+1) # 輸入下一頁text.send_keys(Keys.ENTER) #進行確定except:browser.close()def write_page(page):with open('qq.txt', 'a', encoding='utf-8') as f:for page in get_page_text(page):f.write(json.dumps(page, ensure_ascii=False) + '\n') # 將dict轉(zhuǎn)換為json格式進行保存if __name__ == '__main__':page_last = get_last_page('qq')for i in range(1, page_last+1):write_page(i)browser.close()總結
以上是生活随笔為你收集整理的python爬取qq空间说说的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: !!! JUnit version 3.
- 下一篇: Python爬虫进阶必备 | 关于MD5