Scrapy+Selenium爬取動態(tài)渲染網(wǎng)站

1.簡介

Selenium是一個用于Web應用程序測試的工具蔗崎。直接運行在瀏覽器中弥鹦,就像真正的用戶在操作一樣辨液。支持的瀏覽器包括IE(7, 8, 9, 10, 11)坯临,F(xiàn)irefox煌妈,Safari配猫,Chrome匆瓜,Opera等锐锣,在爬蟲上則是模擬正常用戶訪問網(wǎng)頁并獲取數(shù)據(jù)。

2.安裝 Selenium

> pip install selenium

3.安裝驅(qū)動

模擬真正的用戶操作當然需要選擇好用來操作的瀏覽器著洼,根據(jù)瀏覽器來安裝相應的驅(qū)動調(diào)起晌柬。

3.1 Chrome

使用selenium驅(qū)動chrome瀏覽器需要下載chromedriver,而且chromedriver版本需要與chrome的版本對應郭脂,版本錯誤的話則會運行報錯。

查看chrome的版本澈歉,可通過幫助 > 關(guān)于Google Chrome(G)展鸡。

1563419114.jpg

下載chromedriver可以通過淘寶鏡像地址:http://npm.taobao.org/mirrors/chromedriver/ 。最新的鏡像與Chrome同名埃难,盡量選擇版本相近的避免兼容問題莹弊,鏡像下notes.txt可查看當前驅(qū)動支持的版本。

1563418582.jpg

選擇合適的版本下載涡尘,下載完解壓將chromedriver.exe放在有設(shè)置環(huán)境變量的目錄下忍弛,小編是放在python的安裝目錄下的,即python.exe所在的目錄考抄。

1563419759.jpg

3.2 Firefox

使用selenium驅(qū)動Firefox瀏覽器需要下載geckodriver细疚,查看瀏覽器版本通過幫助 > 關(guān)于 Firefox

1563420565.jpg

下載geckodriver可通過mozilla的倉庫地址:https://github.com/mozilla/geckodriver/releases川梅。

選擇合適的版本下載疯兼,解壓后geckodriver.exe同樣也是放在python的安裝目錄下。

1563420774.jpg

3.3 其它瀏覽器驅(qū)動下載

Opera:http://npm.taobao.org/mirrors/operadriver/

IE:http://selenium-release.storage.googleapis.com/index.html (版本號要與selenium的版本一致贫途,查看安裝的selenium版本吧彪,可通過pip show selenium)如果沒有vpn可能會打不開,可點擊下載3.14.0版本的丢早。

4.Selenium使用

4.1 Chrome 配置

options = webdriver.ChromeOptions()
## 無界面
# options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=options)
driver.set_window_size(1366, 768)
driver.set_page_load_timeout(self.timeout)

注意Chrome可能需要管理員權(quán)限相關(guān)配置姨裸,小編習慣性用Firefox??

4.2 Firefox 配置

# 實例化參數(shù)對象
options = webdriver.FirefoxOptions()
# 無界面
# options.add_argument('--headless')
driver = webdriver.Firefox(firefox_options=options)
driver.set_window_size(1400, 700)
driver.set_page_load_timeout(self.timeout)

4.3 不顯示打開瀏覽器的界面

有的時候我們不想要看到爬取的一步步操作,只關(guān)心結(jié)果怨酝,則可以在參數(shù)配置

# 無界面
options.add_argument('--headless')

4.4 禁用瀏覽器彈窗

不是頁面彈窗傀缩,是瀏覽器設(shè)置里的彈窗。在打開瀏覽器時凫碌,使用參數(shù)配置關(guān)閉
Firefox

options.set_preference('dom.webnotifications.enabled', False)
options.set_preference('dom.push.enabled', False)

Chrome

 prefs = {
     'profile.default_content_setting_values': {
         'notifications': 2
     }
 }
 options.add_experimental_option('prefs', prefs)

4.5 driver屬性和方法

  • 頁面加載

    driver.get("http://www.baidu.com")
    
  • 關(guān)閉瀏覽器

    # 爬蟲結(jié)束關(guān)閉瀏覽器
    driver.close()
    
  • 獲取當前url

    driver.current_url
    
  • 刷新

    driver.refresh()
    
  • 頁面標題

    driver.title
    
  • 頁面渲染后的源碼

    driver.page_source
    
  • 獲取窗口信息

    driver.get_window_rect()
    

    獲取當前窗口的x,y坐標和當前窗口的高度和寬度扑毡,如:{'height': 1366, 'width': 768, 'x': 0, 'y': 200}

  • 設(shè)置 User Agent(Firefox為例)

    profile = webdriver.FirefoxProfile()
    profile.set_preference("general.useragent.override", "some UA string")
    driver = webdriver.Firefox(profile=profile)
    
  • 執(zhí)行js腳本

    使用driver.execute_script([js腳本],*args)同步執(zhí)行,如滑動到第一個class為cm-explain-bottom的元素位置盛险。

    driver.execute_script(
       "document.getElementsByClassName('cm-explain-bottom')[0].scrollIntoView(true)")
    

    異步執(zhí)行使用driver.execute_async_script([js腳本],*args)瞄摊,*argsw為執(zhí)行js代碼要傳入的參數(shù)勋又。

  • 查找元素

    返回一個WebElement對象。

    • 通過id屬性:element = driver.find_element_by_id("coolestWidgetEvah")
    • 通過class屬性:cheeses = driver.find_elements_by_class_name("cheese")
    • 通過標簽名:frame = driver.find_element_by_tag_name("iframe")
    • 通過css選擇器:cheese = driver.find_element_by_css_selector("#food span.dairy.aged")
    • 通過name屬性:cheese = driver.find_element_by_name("cheese")
    • 通過xpath:inputs = driver.find_elements_by_xpath("http://input")
    • 通過鏈接文本(完全匹配):cheese = driver.find_element_by_link_text("cheese")
    • 通過鏈接文本(部分匹配):cheese = driver.find_element_by_partial_link_text("cheese")
  • 元素(WebElement)的屬性和方法

    • 標簽下文本:element.text

    • 點擊:element.click()

    • 表單提交:element.submit()

    • 輸入:element.send_keys(123)

    • 示例:

    # 等待郵箱和密碼可定位及登錄按鈕可提交换帜,清空輸入框楔壤,分別輸入用戶名密碼點擊提交按鈕
    email = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#email")))
    passwd = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#pass")))
    submit = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#loginbutton')))
    email.clear()
    passwd.clear()
    email.send_keys(user)
    passwd.send_keys(password)
    submit.click()
    
  • Cookie操作

    driver.get("http://www.example.com")
    # 給當前url域設(shè)置cookie
    # name的值對應cookie key,value的值對應cookie value
    driver.add_cookie({'name':'key', 'value':'value', 'path':'/'})
    # 可選的屬性
    # 'domain' -> String,
    # 'secure' -> Boolean,
    # 'expiry' -> Milliseconds since the Epoch it should expire.
    
    # 輸出當前url所有的Cookie
    for cookie in driver.get_cookies():
        print "%s -> %s" % (cookie['name'], cookie['value'])
    
    # 通過name刪除Cookie
    driver.delete_cookie("CookieName")
    # 刪除所有的Cookie
    driver.delete_all_cookies()
    
  • 切換頁面框架或窗口

    driver.switch_to.window("windowName")
    

    切換默認框架:driver.switch_to.default_content()

    切換最新窗口:

    windows = driver.window_handles
    # 切換到最新打開的窗口中
    switch_to.window(windows[-1])
    
  • 獲取最新的alert彈窗

    alert = driver.switch_to.alert
    # 關(guān)閉彈窗
    alert.dismiss()
    
  • 當前的url返回或者跟進

    driver.forward()
    driver.back()
    
  • 截屏

    # 返回頁面的base64編碼字符串
    base64 = driver.get_screenshot_as_base64()
    # 返回保存到文件的結(jié)果
    result = driver.get_screenshot_as_file("D:\\example.png")
    # png格式的二進制字符串
    pngSrc =  driver.get_screenshot_as_png()
    

使用Selenium爬取七麥數(shù)據(jù)APP排行榜:點擊前往

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惯驼,一起剝皮案震驚了整個濱河市蹲嚣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祟牲,老刑警劉巖隙畜,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異说贝,居然都是意外死亡议惰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門乡恕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來言询,“玉大人,你說我怎么就攤上這事傲宜≡撕迹” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵函卒,是天一觀的道長辆憔。 經(jīng)常有香客問我,道長谆趾,這世上最難降的妖魔是什么躁愿? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮沪蓬,結(jié)果婚禮上彤钟,老公的妹妹穿的比我還像新娘。我一直安慰自己跷叉,他們只是感情好逸雹,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著云挟,像睡著了一般梆砸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上园欣,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天帖世,我揣著相機與錄音,去河邊找鬼沸枯。 笑死日矫,一個胖子當著我的面吹牛赂弓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哪轿,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼盈魁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窃诉?” 一聲冷哼從身側(cè)響起杨耙,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎飘痛,沒想到半個月后珊膜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡宣脉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年辅搬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脖旱。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖介蛉,靈堂內(nèi)的尸體忽然破棺而出萌庆,到底是詐尸還是另有隱情,我是刑警寧澤币旧,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布践险,位于F島的核電站,受9級特大地震影響吹菱,放射性物質(zhì)發(fā)生泄漏巍虫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一鳍刷、第九天 我趴在偏房一處隱蔽的房頂上張望占遥。 院中可真熱鬧,春花似錦输瓜、人聲如沸瓦胎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搔啊。三九已至,卻和暖如春北戏,著一層夾襖步出監(jiān)牢的瞬間负芋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工嗜愈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旧蛾,地道東北人莽龟。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蚜点,于是被迫代替她去往敵國和親轧房。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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