1. 程式人生 > >Python爬蟲實戰:使用Selenium抓取QQ空間好友說說

Python爬蟲實戰:使用Selenium抓取QQ空間好友說說

前面我們接觸到的,都是使用requests+BeautifulSoup組合對靜態網頁進行請求和資料解析,若是JS生成的內容,也介紹了通過尋找API藉口來獲取資料。

但是有的時候,網頁資料由JS生成,API藉口又死活找不著或者是API藉口地址隨機變換,時間不等人。那就只能使用Selenium了。

一、Selenium簡介

Selenium是一個用於Web應用的功能自動化測試工具,Selenium 直接執行在瀏覽器中,就像真正的使用者在操作一樣。
由於這個性質,Selenium也是一個強大的網路資料採集工具,其可以讓瀏覽器自動載入頁面,獲取需要的資料,甚至頁面截圖,或者是判斷網站上某些動作是否發生。
Selenium自己不帶瀏覽器,需要配合第三方瀏覽器來使用。支援的瀏覽器有Chrome、Firefox、IE、Phantomjs等。
如果使用Chrome、FireFox或IE,我們可以看得到一個瀏覽器的視窗被開啟、開啟網站、然後執行程式碼中的操作。
但是,讓程式在後臺中執行更符合我們爬蟲的氣質,所以自己多使用Phantomjs作為瀏覽器載體,本篇文章也以Phantomjs作介紹
Phantomjs是一個“無頭”瀏覽器,也就是沒有介面的瀏覽器,但是功能與普通的瀏覽器無異。

二、在Python中使用Selenium獲取QQ空間好友說說

之前使用pip安裝好了selenium,直接在程式碼中import即可。
下面我們以一個實際的例子——獲取一個QQ空間好友的說說資訊,來簡單講解一下Selenium+Phantomjs的使用。
我們需要爬取的頁面時這樣的:

python3執行程式碼

  • 依舊先上程式碼:
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
from selenium import webdriver
import time

# #使用Selenium的webdriver例項化一個瀏覽器物件,在這裡使用Phantomjs
# driver = webdriver.PhantomJS(executable_path=r"D:\phantomjs-2.1.1-windows\bin\phantomjs.exe") # #設定Phantomjs視窗最大化 # driver.maximize_window() # 登入QQ空間 def get_shuoshuo(qq): chromedriver = r"D:\soft\chromedriver_win32\chromedriver.exe" driver = webdriver.Chrome(chromedriver) #使用get()方法開啟待抓取的URL
driver.get('http://user.qzone.qq.com/{}/311'.format(qq)) time.sleep(5) #等待5秒後,判斷頁面是否需要登入,通過查詢頁面是否有相應的DIV的id來判斷 try: driver.find_element_by_id('login_div') a = True except: a = False if a == True: #如果頁面存在登入的DIV,則模擬登入 driver.switch_to.frame('login_frame') driver.find_element_by_id('switcher_plogin').click() driver.find_element_by_id('u').clear() # 選擇使用者名稱框 driver.find_element_by_id('u').send_keys('QQ號碼') driver.find_element_by_id('p').clear() driver.find_element_by_id('p').send_keys('QQ密碼') driver.find_element_by_id('login_button').click() time.sleep(3) driver.implicitly_wait(3) #判斷好友空間是否設定了許可權,通過判斷是否存在元素ID:QM_OwnerInfo_Icon try: driver.find_element_by_id('QM_OwnerInfo_Icon') b = True except: b = False #如果有許可權能夠訪問到說說頁面,那麼定位元素和資料,並解析 if b == True: driver.switch_to.frame('app_canvas_frame') content = driver.find_elements_by_css_selector('.content') stime = driver.find_elements_by_css_selector('.c_tx.c_tx3.goDetail') for con, sti in zip(content, stime): data = { 'time': sti.text, 'shuos': con.text } print(data) pages = driver.page_source soup = BeautifulSoup(pages, 'lxml') #嘗試一下獲取Cookie,使用get_cookies() cookie = driver.get_cookies() cookie_dict = [] for c in cookie: ck = "{0}={1};".format(c['name'], c['value']) cookie_dict.append(ck) i = '' for c in cookie_dict: i += c print('Cookies:', i) print("==========完成================") driver.close() driver.quit() if __name__ == '__main__': get_shuoshuo('好友QQ號碼')

獲取到的資料截圖如下:

三、程式碼簡析

1.照例,匯入需要使用的模組:

from bs4 import BeautifulSoup
from selenium import webdriver
import time

2.使用Selenium的webdriver例項化一個瀏覽器物件,在這裡使用Phantomjs:

driver = webdriver.PhantomJS(executable_path="D:\\phantomjs.exe")

3.設定Phantomjs視窗最大化:

driver.maximize_window()

4.主函式部分
使用get()方法開啟待抓取的URL:

driver.get('http://user.qzone.qq.com/{}/311'.format(qq))

等待5秒後,判斷頁面是否需要登入,通過查詢頁面是否有相應的DIV的id來判斷:

    try:
        driver.find_element_by_id('login_div')
        a = True
    except:
        a = False

如果頁面存在登入的DIV,則模擬登入:


        driver.switch_to.frame('login_frame') #切換到登入ifram
        driver.find_element_by_id('switcher_plogin').click()
        driver.find_element_by_id('u').clear()#選擇使用者名稱框
        driver.find_element_by_id('u').send_keys('QQ號')
        driver.find_element_by_id('p').clear()#選擇密碼框
        driver.find_element_by_id('p').send_keys('QQ密碼')
        driver.find_element_by_id('login_button').click()#點選登入按鈕
        time.sleep(3)

接著,判斷好友空間是否設定了許可權,通過判斷是否存在元素ID:QM_OwnerInfo_Icon

  try:
        driver.find_element_by_id('QM_OwnerInfo_Icon')
        b = True
    except:
        b = False

如果有許可權能夠訪問到說說頁面,那麼定位元素和資料,並解析:


    if b == True:
        driver.switch_to.frame('app_canvas_frame')
        content = driver.find_elements_by_css_selector('.content')
        stime = driver.find_elements_by_css_selector('.c_tx.c_tx3.goDetail')
        for con,sti in zip(content,stime):
            data = {
                # 'qq':qq,
                'time':sti.text,
                'shuos':con.text
            }
            print(data)

除了在Selenium中解析資料,我們還可以將當前頁面儲存為原始碼,再使用BeautifulSoup來解析:

pages = driver.page_source
soup = BeautifulSoup(pages,'lxml')

最後,我們嘗試一下獲取Cookie,使用get_cookies():

   cookie = driver.get_cookies()
    cookie_dict = []
    for c in cookie:
        ck = "{0}={1};".format(c['name'],c['value'])
        cookie_dict.append(ck)
    i = ''
    for c in cookie_dict:
        i += c
    print('Cookies:',i)

另外,再介紹兩個Selenium的常用方法:
- 儲存螢幕截圖:


driver.save_screenshot('儲存的檔案路徑及檔名')
  • 執行JS指令碼:
driver.execute_script("JS程式碼")

對於Selenium更加詳細的操作和使用,推薦一本書《selenium webdriver(python)第三版》網上可以搜尋到;