Python爬蟲入門實(shí)戰(zhàn)七:使用Selenium--以抓取QQ空間好友說說為例

前面我們接觸到的鸡岗,都是使用requests+BeautifulSoup組合對(duì)靜態(tài)網(wǎng)頁(yè)進(jìn)行請(qǐng)求和數(shù)據(jù)解析瓶竭,若是JS生成的內(nèi)容外遇,也介紹了通過尋找API借口來獲取數(shù)據(jù)榴都。

但是有的時(shí)候索绪,網(wǎng)頁(yè)數(shù)據(jù)由JS生成湖员,API借口又死活找不著或者是API借口地址隨機(jī)變換,時(shí)間不等人瑞驱。那就只能使用Selenium了娘摔。

一、Selenium簡(jiǎn)介

Selenium是一個(gè)用于Web應(yīng)用的功能自動(dòng)化測(cè)試工具唤反,Selenium 直接運(yùn)行在瀏覽器中凳寺,就像真正的用戶在操作一樣。

由于這個(gè)性質(zhì)彤侍,Selenium也是一個(gè)強(qiáng)大的網(wǎng)絡(luò)數(shù)據(jù)采集工具肠缨,其可以讓瀏覽器自動(dòng)加載頁(yè)面,獲取需要的數(shù)據(jù)盏阶,甚至頁(yè)面截圖晒奕,或者是判斷網(wǎng)站上某些動(dòng)作是否發(fā)生。

Selenium自己不帶瀏覽器名斟,需要配合第三方瀏覽器來使用吴汪。支持的瀏覽器有Chrome、Firefox蒸眠、IE漾橙、Phantomjs等。

如果使用Chrome楞卡、FireFox或IE欲间,我們可以看得到一個(gè)瀏覽器的窗口被打開、打開網(wǎng)站午衰、然后執(zhí)行代碼中的操作。

但是藕各,讓程序在后臺(tái)中運(yùn)行更符合我們爬蟲的氣質(zhì),所以自己多使用Phantomjs作為瀏覽器載體焦除,本篇文章也以Phantomjs作介紹

Phantomjs是一個(gè)“無頭”瀏覽器激况,也就是沒有界面的瀏覽器,但是功能與普通的瀏覽器無異膘魄。

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

之前使用pip安裝好了selenium,直接在代碼中import即可创葡。

下面我們以一個(gè)實(shí)際的例子——獲取一個(gè)QQ空間好友的說說信息浙踢,來簡(jiǎn)單講解一下Selenium+Phantomjs的使用。

我們需要爬取的頁(yè)面時(shí)這樣的:


QQ空間好友說說的鏈接為:http://user.qzone.qq.com/{好友QQ號(hào)}/311

我們抓取他發(fā)的說說的時(shí)間和內(nèi)容灿渴。

依舊先上代碼:

from bs4 import BeautifulSoup

from selenium import webdriver

import time


#使用selenium

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

driver.maximize_window()

#登錄QQ空間

def get_shuoshuo(qq):

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

????time.sleep(5)

????try:

????????driver.find_element_by_id('login_div')

????????a = True

????except:

????????a = False

????if a == True:

????????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號(hào)')

????????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)

????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 = 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號(hào)')

獲取到的數(shù)據(jù)截圖如下:


接下來我們通過講解代碼洛波,稍微了解一下Selenium的使用

三、代碼簡(jiǎn)析

1.照例骚露,導(dǎo)入需要使用的模塊:

from bs4 import BeautifulSoup

from selenium import webdriver

import time

2.使用Selenium的webdriver實(shí)例化一個(gè)瀏覽器對(duì)象蹬挤,在這里使用Phantomjs:

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

3.設(shè)置Phantomjs窗口最大化:

1driver.maximize_window()

4.主函數(shù)部分

使用get()方法打開待抓取的URL:

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

等待5秒后,判斷頁(yè)面是否需要登錄棘幸,通過查找頁(yè)面是否有相應(yīng)的DIV的id來判斷:

????try:

????????driver.find_element_by_id('login_div')

????????a = True

????except:

????????a = False

如果頁(yè)面存在登錄的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號(hào)')

????????driver.find_element_by_id('p').clear()#選擇密碼框

????????driver.find_element_by_id('p').send_keys('QQ密碼')

????????driver.find_element_by_id('login_button').click()#點(diǎn)擊登錄按鈕

????????time.sleep(3)

接著,判斷好友空間是否設(shè)置了權(quán)限够话,通過判斷是否存在元素ID:QM_OwnerInfo_Icon

?try:

????????driver.find_element_by_id('QM_OwnerInfo_Icon')

????????b = True

????except:

????????b = False

如果有權(quán)限能夠訪問到說說頁(yè)面,那么定位元素和數(shù)據(jù)光绕,并解析:

?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中解析數(shù)據(jù)女嘲,我們還可以將當(dāng)前頁(yè)面保存為源碼,再使用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)

另外,再介紹兩個(gè)Selenium的常用方法:

保存屏幕截圖:

1driver.save_screenshot('保存的文件路徑及文件名')

執(zhí)行JS腳本:

driver.execute_script("JS代碼")

對(duì)于Selenium更加詳細(xì)的操作和使用停蕉,推薦一本書《selenium webdriver(python)第三版》網(wǎng)上可以搜索到愕鼓;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市慧起,隨后出現(xiàn)的幾起案子菇晃,更是在濱河造成了極大的恐慌,老刑警劉巖蚓挤,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磺送,死亡現(xiàn)場(chǎng)離奇詭異驻子,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)估灿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門崇呵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人馅袁,你說我怎么就攤上這事域慷。” “怎么了汗销?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵犹褒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我大溜,道長(zhǎng)化漆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任钦奋,我火速辦了婚禮座云,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘付材。我一直安慰自己朦拖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布厌衔。 她就那樣靜靜地躺著璧帝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪富寿。 梳的紋絲不亂的頭發(fā)上睬隶,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音页徐,去河邊找鬼苏潜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛变勇,可吹牛的內(nèi)容都是我干的恤左。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼搀绣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼飞袋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起链患,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤巧鸭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后麻捻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹄皱,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡览闰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巷折。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片压鉴。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锻拘,靈堂內(nèi)的尸體忽然破棺而出油吭,到底是詐尸還是另有隱情,我是刑警寧澤署拟,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布婉宰,位于F島的核電站,受9級(jí)特大地震影響推穷,放射性物質(zhì)發(fā)生泄漏心包。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一馒铃、第九天 我趴在偏房一處隱蔽的房頂上張望蟹腾。 院中可真熱鬧,春花似錦区宇、人聲如沸娃殖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炉爆。三九已至,卻和暖如春卧晓,著一層夾襖步出監(jiān)牢的瞬間芬首,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工逼裆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留郁稍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓波附,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親昼钻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掸屡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容