【python】爬蟲:動態(tài)網(wǎng)頁爬取

selenium

【介紹】:selenium 是一套完整的web應(yīng)用程序測試系統(tǒng),包含了測試的錄制(selenium IDE)榆俺,編寫及運(yùn)行(Selenium Remote Control)測試的并行處理(Selenium Grid)骑歹。

【通俗的解讀】:Selenium最初是為網(wǎng)站自動化測試而開發(fā)的预烙,Selenium 可以直接運(yùn)行在瀏覽器上,它支持所有主流的瀏覽器(包括PhantomJS)陵刹,當(dāng)然啦默伍,也可以接收指令,讓瀏覽器自動加載頁面衰琐,獲取需要的數(shù)據(jù)也糊,甚至頁面截屏,功能豐富羡宙,不容錯過哦 狸剃。

安裝:

pip install selenium

(最好是加一個清華源,安裝速度Plus):

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
Chrome瀏覽器驅(qū)動的安裝

可參考:http://blog.csdn.net/huilan_same/article/details/51896672
【注意】:要下載對應(yīng)版本的chromedriverhttp://npm.taobao.org/mirrors/chromedriver/

Chromedriver 驅(qū)動

沒有驅(qū)動的狀態(tài)下,報錯:selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.(需要給'chromedriver'配置路徑)
【處理辦法】:在你編譯環(huán)境python中配置一下路徑狗热。分為以下兩個步驟:

  • 找到你編譯環(huán)境python的文件路徑钞馁;
  • 將你對應(yīng)版本的安裝文件(.exe)放入python目錄下的Scripts目錄中;
目錄

頁面元素定位符:

在爬蟲的一系列操作中匿刮,如何給目標(biāo)元素定位是十分總要的基礎(chǔ)操作僧凰。
selenium中 最核心的技巧是WebElement類型的識別和定位,主要介紹以下八類:

(1)By.id() 通過id定位
 browser.find_element_by_id("kw")

【注解】:元素的id屬性來定位元素——id是唯一標(biāo)識
這里的兩種形式是同樣的效果..

    browser.find_element_by_id("kw")
    # 另一種形式:
    browser.find_element((By.id,"kw"))

【重點(diǎn)】:這里的兩種形式是等價的熟丸!

(2)By.name() 通過name 定位
search=browser.find_element_by_name("wd")

search=browser.find_elements_by_name("wd")

【解釋】:

  • 如果name屬性的值kw是唯一的训措,用find_element_by_name定位元素,返回值是一個值;
  • 如果name屬性的值kw不是唯一的绩鸣,用find_elements_by_name定位元素怀大,返回符合條件的多個值,保存在列表中呀闻,即返回的是列表化借。
(3)By.xpath() 通過xpath定位
browser.find_element_by_xpath("http://*[@id='kw']")
(4) By.className() 通過className定位

【介紹】:通過元素的class屬性來定位元素,class屬性不是絕對唯一的捡多。(標(biāo)簽的class屬性可能相同)

browser.find_element_by_class_name("s_ipt")
(5) By.cssSelector() 通過CSS 定位
browser.find_element_by_css_selector()
(6)By.linkText() 通過linkText
browser.find_element_by_link_text()
  • 精確匹配——文本內(nèi)容唯一蓖康;
  • 模糊匹配——通過文本內(nèi)容的部分內(nèi)容,文本內(nèi)容不唯一局服;
(7)By.tagName() 通過tagName
 browser.find_element_by_tag_name("input")
(8)By.partialLinkText() 通過匹到的部分linkText
browser.find_element_by_partial_link_text()

【注意】:查找多個元素節(jié)點(diǎn)元素單個節(jié)點(diǎn)相同钓瞭,只是將element + s。例如:

    browser.find_elements_by_css_selector()
    browser.find_elements_by_id()
    browser.find_elements_by_name()
    browser.find_elements_by_link_text()
    browser.find_element_by_partial_link_text()

【小案例】:運(yù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

browser = webdriver.Chrome()
try:
    browser.get("https://www.baidu.com")
    input = browser.find_element_by_id('kw')
    input.send_keys('簡書')
    input.send_keys(Keys.ENTER)
    # 等待對象反應(yīng)
    wait = WebDriverWait(browser,100)
    locator = (By.ID,"content")
    wait.until(EC.presence_of_element_located((locator)))
    print(browser.current_url)
    print(browser.get_cookies())
    # print(browser.page_source)
    ele = browser.find_element_by_id("content_left")
    print(ele)

finally:
    browser.close()

【小案例】:運(yùn)行小程序堤结,在京東搜索商品唆迁。
網(wǎng)址:https://www.jd.com

from time import sleep
from selenium import webdriver
# 京東商城搜索
def simulate_jd_search():
    browser = webdriver.Chrome()
    browser.get("https://www.jd.com")
    # 模擬輸入問題
    input = browser.find_element_by_id("key")
    input.send_keys("手機(jī)")
    time.sleep(3)
    # 模擬清空內(nèi)容
    input.clear()
    input.send_keys("小豬")
    button = browser.find_element_by_css_selector("button.button")
    button.click()
    time.sleep(10)

simulate_jd_search()

【小案例】:運(yùn)行小程序,模擬鼠標(biāo)拖拽
網(wǎng)址:https://www.runoob.com/try/try.php?filename=jqueryui-example-droppable

from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
def simulate_drop():
    browser = webdriver.Chrome()
    browser.get("https://www.runoob.com/try/try.php?filename=jqueryui-example-droppable")
    # 切換到id是iframeResult的iframe標(biāo)簽中竞穷;
    browser.switch_to.frame("iframeResult")
    source = browser.find_element_by_css_selector("#draggable")
    target = browser.find_element_by_css_selector("#droppable")
    actions = ActionChains(browser)

    actions.drag_and_drop(source,target)
    actions.perform()   #執(zhí)行
    time.sleep(10)      #延遲10秒

simulate_drop()

關(guān)于selenium.webdrive之ActionChains

ActionChains是自動執(zhí)行低級交互的一種方式唐责,例如:鼠標(biāo)移動,鼠標(biāo)點(diǎn)按瘾带,鍵盤操作鼠哥,文本操作等。

當(dāng)我們調(diào)用這里的方法時看政,這些操作會被先儲存在一個隊列中朴恳,當(dāng)我們調(diào)用perform()方法時,隊列中的操作會被按順序執(zhí)行允蚣,執(zhí)行后隊列被清空于颖。

關(guān)于ActionChains 類提供的鼠標(biāo)操作的常用方法見下表:

常用方法 鼠標(biāo)操作 參數(shù)
click(self, element=None) 點(diǎn)擊 若參數(shù)None,那么點(diǎn)擊當(dāng)前位置嚷兔;若參數(shù)是element森渐,那么點(diǎn)擊此元素;
click_and_hold(self, element=None) 鼠標(biāo)左鍵按住某個元素 同上
context_click(self, element=None) 右鍵點(diǎn)擊 同上
** double_click()** 雙擊 同上
drag_and_drop(source, target) 拖動 【source】: 元素位置冒晰;【target】: 目標(biāo)位置同衣;
move_to_element(self, to_element): 鼠標(biāo)懸停 to_element: 定位需要懸停的元素
drag_and_drop_by_offset(self, source, xoffset, yoffset): 按住元素,然后移動目標(biāo)偏移量 【source】: 元素位置壶运; 【xoffset】: X 軸的偏移量耐齐;【yoffset】: Y 軸的偏移量
key_down(self, value, element=None) 應(yīng)用于修飾鍵(控制、alt和shift) 【value】: 要發(fā)送的修飾符鍵;【element】:定位的元素
send_keys(self, *keys_to_send) 發(fā)送到當(dāng)前焦點(diǎn)元素 要發(fā)送的按鍵蚪缀。(修飾符鍵常數(shù)可以在“Keys”類)

【注】:更多鼠標(biāo)操作可參考:http://www.51testing.com/index.php?action-viewnews-itemid-3725836-php-1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秫逝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子询枚,更是在濱河造成了極大的恐慌违帆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件金蜀,死亡現(xiàn)場離奇詭異刷后,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)渊抄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門尝胆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人护桦,你說我怎么就攤上這事含衔。” “怎么了二庵?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵贪染,是天一觀的道長。 經(jīng)常有香客問我催享,道長杭隙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任因妙,我火速辦了婚禮痰憎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攀涵。我一直安慰自己铣耘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布汁果。 她就那樣靜靜地躺著涡拘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪据德。 梳的紋絲不亂的頭發(fā)上鳄乏,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音棘利,去河邊找鬼橱野。 笑死,一個胖子當(dāng)著我的面吹牛善玫,可吹牛的內(nèi)容都是我干的水援。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜗元!你這毒婦竟也來了或渤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奕扣,失蹤者是張志新(化名)和其女友劉穎薪鹦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惯豆,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡池磁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了楷兽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片地熄。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芯杀,靈堂內(nèi)的尸體忽然破棺而出端考,到底是詐尸還是另有隱情,我是刑警寧澤瘪匿,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布跛梗,位于F島的核電站,受9級特大地震影響棋弥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诚欠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一顽染、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轰绵,春花似錦粉寞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至液样,卻和暖如春振亮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鞭莽。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工坊秸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人澎怒。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓褒搔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子星瘾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355