【Python爬蟲】selenium+Phantomjs

工具簡(jiǎn)介:

1是晨、selenium簡(jiǎn)介:
一個(gè)用于Web應(yīng)用自動(dòng)化程序測(cè)試的工具竟稳,測(cè)試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣沦补,它可以根據(jù)我們的指令该默、讓瀏覽器自動(dòng)加載頁面,獲取需要的數(shù)據(jù)策彤,甚至頁面截屏,或者判斷網(wǎng)站上某些動(dòng)作是否發(fā)生匣摘,本身不帶瀏覽器店诗,不支持瀏覽器的功能,需要與第三方瀏覽器結(jié)合在一起才能使用音榜,如Firefox庞瘸,Chrome,也可以使用headless瀏覽器PhantomJS在后臺(tái)執(zhí)行赠叼,它可以用來爬取任何網(wǎng)頁上看到的數(shù)據(jù)擦囊。

PS:selenium庫有個(gè)叫webdriver的API,它可以加載網(wǎng)站的瀏覽器嘴办,也可以像BeautifulSoup一樣用來定位元素

Selenium的下載與安裝

  • 安裝:在終端輸入 pip install selenium
  • 下載:下載Chromedriver瞬场,解壓后放在…\Google\Chrome\Application\
  • 環(huán)境變量:將該目錄添加至環(huán)境變量

使用代碼測(cè)試:

from selenium import webdriver #導(dǎo)入包
driver = webdriver.Chrome()  #打開Chrome瀏覽器
driver.get("http://www.baidu.com/s?wd=python")  #輸入url,百度搜索python

界面如下:

image.png

Selenium的優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):可以爬取任何網(wǎng)頁的任何內(nèi)容涧郊,因?yàn)樗峭ㄟ^瀏覽器訪問的方式進(jìn)行數(shù)據(jù)的爬取贯被,沒有網(wǎng)站會(huì)拒絕瀏覽器的訪問
  • 缺點(diǎn):時(shí)間以及內(nèi)存消耗太大

Selenium的操作
查找符合條件的單個(gè)元素:driver.find_element_by_name()
查找符合條件的一組元素:driver.find_elements_by_name()

點(diǎn)擊查看更多操作

2、Phantomjs:Python爬蟲利器
一個(gè)基于 WebKit 的服務(wù)器端 JavaScriptAPI妆艘,無界面(headless)瀏覽器彤灶,它會(huì)把網(wǎng)站加載到內(nèi)存并執(zhí)行頁面上的JavaScript,是一個(gè)功能完善(雖然無界面)的瀏覽器批旺,可以用于頁面訪問自動(dòng)化幌陕,網(wǎng)絡(luò)監(jiān)測(cè),網(wǎng)頁截屏汽煮,以及無界面的Web測(cè)試等

PS:Phantomjs非一個(gè)Python的庫搏熄,所以要去官網(wǎng)下載棚唆,安裝后進(jìn)行環(huán)境變量的設(shè)置

找不到Phantomjs.png

運(yùn)行報(bào)錯(cuò):Message 'phantomjs' executable needs to be in PATH?
解決辦法:路徑只寫到bin有可能不夠搬卒,把最后的可執(zhí)行文件也要寫上去
driver = webdriver.PhantomJS("G:/Program Files (x86)/Python/Scripts/phantomjs-2.1.1-windows/bin/phantomjs.exe")

元素的定位

對(duì)象的定位是通過屬性定位來實(shí)現(xiàn)的瑟俭,或是其他的一些信息來找到這個(gè)對(duì)象
如百度輸入框源碼:

百度輸入框.png
# 通過id定位
inputid = driver.find_element_by_id("kw")
# 通過name屬性定位
iuputname = driver.find_element_by_name("wd")
# 通過class屬性定位
inputclass = driver.find_element_by_class_name("s_ipt")
# 通過標(biāo)簽屬性定位
inputtagname = driver.find_element_by_tag_name("input")
# 通過css方式定位
inputcss = driver.find_element_by_css_selector("#kw")
# 通過xpath方式定位
inputxpath = driver.find_element_by_xpath("http://*[@id='kw']")
# 獲取標(biāo)簽的類型
print(inputid.tag_name)

瀏覽器操作

1、截屏:save_screenshot

url = "http://www.baidu.com"
driver.get(url)
time.sleep(1)
# 截屏獲取瀏覽器頁面
driver.save_screenshot("baidu.png")

2契邀、前進(jìn)與后退

# 發(fā)送數(shù)據(jù)請(qǐng)求
driver.get("http://www.baidu.com")
time.sleep(1)
# 截屏獲取瀏覽器頁面
driver.save_screenshot("baidu.png")
driver.get("http://www.youku.com")
driver.save_screenshot("youku.png")
# 后退
driver.back()
driver.save_screenshot("baidu2.png")
# 前進(jìn)
driver.forward()
driver.save_screenshot("youku2.png")

對(duì)象操作摆寄,如全選、剪切

# 輸入關(guān)鍵字
inputid.send_keys("python")
# 通過回車進(jìn)行查詢操作
inputid.send_keys(Keys.RETURN)
inputid.send_keys(Keys.ENTER)
# 暫停2秒坯门,獲取數(shù)據(jù)
#time.sleep(2)
#driver.set_page_load_timeout(2)
driver.save_screenshot("baidu3.png")
# 全選輸入框內(nèi)容
inputid.send_keys(Keys.CONTROL, "a")
driver.save_screenshot("baidu4.png")
# 剪切輸入框內(nèi)容
inputid.send_keys(Keys.CONTROL, "x")

# 獲取查詢按鈕微饥,并點(diǎn)擊
button = driver.find_element_by_id("su").click()

實(shí)戰(zhàn)環(huán)節(jié)

爬取淘寶網(wǎng)-波西米亞裙的商品信息,并把爬取的數(shù)據(jù)存儲(chǔ)在MongoDB數(shù)據(jù)庫中

  1. 訪問淘寶網(wǎng)古戴;
  2. 分析搜索框的xpath語句欠橘,并send_keys("波西米亞裙");
  3. 分析頁面现恼,找到每條商品的信息肃续,使用xpath提取數(shù)據(jù)并將其存儲(chǔ)成字典的格式,進(jìn)行輸出叉袍;
  4. 找到下一頁的按鈕始锚,模擬點(diǎn)擊它,并循環(huán)第3步,直到循環(huán)結(jié)束 。

實(shí)現(xiàn)代碼:

# -*- coding: utf-8 -*-
# __author__ = 'Carina'


from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from pyquery import PyQuery as pq
import re

#driver = webdriver.Chrome()
driver = webdriver.PhantomJS()
wait = WebDriverWait(driver, 10)
# 訪問淘寶網(wǎng)费就,輸入波希米亞裙
def search():
    try:
        driver.get("https://www.taobao.com")
        # 首頁輸入框
        input_box = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#q")))
        # 搜索按鈕
        submit = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#J_SearchForm > button")))
        input_box.send_keys('波希米亞裙')
        submit.click()
        total = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total")))
        # 調(diào)用函數(shù)--商品信息
        get_products()
        return total.text
    except TimeoutError:
        return search()

# 跳轉(zhuǎn)到下一頁
def next_page(page_number):
    try:
        # 底部頁碼輸入框
        input_box = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input")))
        # 底部確定按鈕
        submit = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit")))
        input_box.clear()
        input_box.send_keys(page_number)
        submit.click()
        wait.until(ec.text_to_be_present_in_element((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > ul > li.item.active > span"), str(page_number)))
        get_products()
    except TimeoutError:
        next_page()

# 獲取淘寶商品信息
def get_products():
    wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-itemlist.items.item")))
    html = driver.page_source
    doc = pq(html)   #pyquery (driver.page_source)就相當(dāng)于requests.get獲取的內(nèi)容
    items = doc("#mainsrp-itemlist.items.item").items()
    for item in items:
        product = {
            "image": item.find('.pic .img').attr('src'),
            "price": item.find('.price').text(),
            "deal": item.find('.deal-cnt').text()[:-3],
            "title": item.find('.title').text(),
            "shop": item.find('.shop').text(),
            "location": item.find('.location').text(),            
        }
    print(product)

def main():
    total = search()
    total = int(re.compile('(\d+)').search(total).group(1))
    # 爬取所有的數(shù)據(jù)用total+1
    for i in range(2, 4):
        next_page(i)
        

if __name__ == "__main__":
    main()
    



PS:在學(xué)這塊內(nèi)容的時(shí)候,遇到問題了姐呐,然后去尋求答案,無意中看到了頭條上的新聞典蝌,PhantomJS宣布終止開發(fā)曙砂,所以還是學(xué)習(xí)Firefox和Chrome吧


寫在最后的話

1、常用的學(xué)習(xí)方法:邊學(xué)邊做
把自己學(xué)習(xí)成果分享出來赠法,發(fā)在博客或者GitHub上麦轰,變成開源項(xiàng)目,成為自己的加分項(xiàng)
**2砖织、常用的學(xué)習(xí)網(wǎng)站:GitHub
如何去使用Github款侵?
1)點(diǎn)擊Explore

image.png

2)向下拉找到“See more trending repositories”

image.png

3)點(diǎn)擊選取感興趣的語言方向

image.png

4)可以對(duì)感興趣的項(xiàng)目進(jìn)行Star操作

image.png

5)點(diǎn)擊項(xiàng)目,可查看項(xiàng)目詳情

image.png


擴(kuò)展閱讀:蟲師:隨筆分類 -selenium侧纯、Pyquery包
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末新锈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子眶熬,更是在濱河造成了極大的恐慌妹笆,老刑警劉巖块请,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拳缠,居然都是意外死亡墩新,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門窟坐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來海渊,“玉大人,你說我怎么就攤上這事哲鸳〕家桑” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵徙菠,是天一觀的道長讯沈。 經(jīng)常有香客問我,道長婿奔,這世上最難降的妖魔是什么缺狠? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮萍摊,結(jié)果婚禮上儒老,老公的妹妹穿的比我還像新娘。我一直安慰自己记餐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布薇正。 她就那樣靜靜地躺著片酝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挖腰。 梳的紋絲不亂的頭發(fā)上雕沿,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音猴仑,去河邊找鬼审轮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辽俗,可吹牛的內(nèi)容都是我干的疾渣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼崖飘,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼榴捡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起朱浴,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤吊圾,失蹤者是張志新(化名)和其女友劉穎达椰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體项乒,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啰劲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了檀何。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝇裤。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖埃碱,靈堂內(nèi)的尸體忽然破棺而出猖辫,到底是詐尸還是另有隱情,我是刑警寧澤砚殿,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布啃憎,位于F島的核電站,受9級(jí)特大地震影響似炎,放射性物質(zhì)發(fā)生泄漏辛萍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一羡藐、第九天 我趴在偏房一處隱蔽的房頂上張望贩毕。 院中可真熱鬧,春花似錦仆嗦、人聲如沸辉阶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谆甜。三九已至,卻和暖如春集绰,著一層夾襖步出監(jiān)牢的瞬間规辱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工栽燕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留罕袋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓碍岔,卻偏偏與公主長得像浴讯,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蔼啦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359