使用Python selenium處理頁面延遲加載問題

使用python爬取數(shù)據(jù)的時候官辈,碰到了一個非常無語的問題。有個網(wǎng)站贮折,在輸入url進入頁面之后裤翩,會強制加載一段動畫,之后才顯示正確內容调榄。后來發(fā)現(xiàn)了selenium這個神器踊赠,不過還是折騰了我好久。更多見:iii.run


用selenium 設置瀏覽器等待時間

很多人問每庆,這個下拉框定位不到筐带、那個彈出框定位不到…各種定位不到,其實大多數(shù)情況下就是兩種問題:1 有frame缤灵,2 沒有加等待伦籍。殊不知,你的代碼運行速度是什么量級的腮出,而瀏覽器加載渲染速度又是什么量級的帖鸦,就好比閃電俠和奧特曼約好去打怪獸,然后閃電俠打完回來之后問奧特曼你為啥還在穿鞋沒出門胚嘲?奧特曼分分中內心一萬只羊駝飛過作儿,欺負哥速度慢,哥不跟
運行需要兩個前提馋劈,每個都不好搞攻锰。晾嘶。

  • 首先需要安裝**selenium **,
    推薦使用pip安裝,pip install selenium
    或者直接下載selenium包:https://pypi.python.org/pypi/selenium口注,解壓,cmd進入目錄:python setup.py install
  • 接下來安裝** ChromeDriver**
    推薦在這里 https://sites.google.com/a/chromium.org/chromedriver/downloads 下載君珠,然后放在Chrome瀏覽器目錄內寝志,配置Path環(huán)境變量為形如 XXGoogle\Chrome\Application的形式
    你玩了,拋個異常撂挑子了策添。

最簡單粗暴的一種辦法就是強制等待sleep(xx)材部,強制讓閃電俠等xx時間,不管凹凸曼能不能跟上速度唯竹,還是已經(jīng)提前到了乐导,都必須等xx時間。

# coding: utf-8
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://feiyang.li')
sleep(3) # 強制等待3秒再執(zhí)行下一步
print driver.title
driver.quit()

結合selenium使用Xpath獲得所需信息

  • 需要注意的是浸颓,selenium內find_elements的方法有很多種物臂,xpath表達式的要求很嚴格,所以可以試試find_elements_id等方法产上。
  • Xpath表達式可以檢測文字中是否包含某文字棵磷,以此為標準過濾。


    mark
  • Xpath表達式支持and 和 or晋涣。
def extract_from(browser):
    links = browser.find_elements_by_xpath("http://p[contains(text(), '出處') or contains(text(), '組成') or contains(text(), '組成') or contains(text(), '主治') or contains(text(), '用法')] ")
    print(browser.title)
    return [link.text for link in links]

中文輸入輸出問題

  • send_keys() 不能正確的輸入關鍵字仪媒,在中文前邊加一個u即可,比如elem.send_keys(u'你好哇')
  • 不能正確的輸出中文谢鹊,print ('\n'.join(extract_from(browser)))
    以上兩個問題都跟python2的特性有關算吩,升級至3之后應當不會出現(xiàn)此類問題。

寫了一個小demo佃扼,解釋中文輸入輸出問題

# coding=utf-8

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def search(key):
    elem = browser.find_element_by_xpath("http://input[@id='kw']")
    elem.send_keys(key)
    elem.send_keys(Keys.RETURN)
    time.sleep(1)
def extract_from(browser):
    links = browser.find_elements_by_xpath("http://div[contains(text(),'李銀河')]")
    return [link.text for link in links]
key = u"你好哇"
browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
search(key)
print ('\n'.join(extract_from(browser)))
browser.close()

運行結果見下偎巢,可以抽取出對應文字。


運行結果

Code

# coding=utf-8

import time
import requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys


def search(key):
    elem = browser.find_element_by_xpath("http://input[@id='simple_search_filed']")
    elem.send_keys(key)
    elem.send_keys(Keys.RETURN)
    time.sleep(3)

def extract_from(browser):
    links = browser.find_elements_by_xpath("http://p[contains(text(), '出處') or contains(text(), '組成') or contains(text(), '組成') or contains(text(), '主治') or contains(text(), '用法')] ")
    print(browser.title)
    return [link.text for link in links]

from lxml import etree
html = requests.get("http://www.zk120.com/fang/")
html.encoding = 'utf-8'
selector = etree.HTML(html.text)
content = selector.xpath("http://ul/li/a/span[@class='free_icon_r']/../@href")
for imgurl in content:
    imgurl = "http://www.zk120.com" +imgurl
    browser = webdriver.Chrome()
    browser.get(imgurl)
    time.sleep(2)
    print ('\n'.join(extract_from(browser)))
    print("------------")
    browser.close()

參考代碼

在搜索資料的時候兼耀,同時發(fā)現(xiàn)了一個非常好的示例代碼

import re

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


def extract_data(browser):
    links = browser.find_elements_by_xpath('//i[@class="RecordStats"]/a')
    return [link.get_attribute('href') for link in links]


browser = webdriver.Firefox()
browser.get("http://www.scba.gov.ar/jurisprudencia/Navbar.asp?Busca=Fallos+Completos&SearchString=Inconstitucionalidad")

# get max pages
element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, "http://p[@class='c'][last()]")))
max_pages = int(re.search(r'\d+ de (\d+)', element.text).group(1), re.UNICODE)

# extract from the current (1) page
print "Page 1"
print extract_data(browser)

# loop over the rest of the pages
for page in xrange(2, max_pages + 1):
    print "Page %d" % page

    next_page = browser.find_element_by_xpath("http://table[last()]//td[last()]/a").click()

    print extract_data(browser)
    print "-----"

這個地方真的花費了我好大的精力啊艘狭,讓人頭疼。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末翠订,一起剝皮案震驚了整個濱河市巢音,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尽超,老刑警劉巖官撼,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異似谁,居然都是意外死亡傲绣,警方通過查閱死者的電腦和手機掠哥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秃诵,“玉大人续搀,你說我怎么就攤上這事〔ぞ唬” “怎么了禁舷?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長毅往。 經(jīng)常有香客問我牵咙,道長,這世上最難降的妖魔是什么攀唯? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任洁桌,我火速辦了婚禮,結果婚禮上侯嘀,老公的妹妹穿的比我還像新娘另凌。我一直安慰自己,他們只是感情好戒幔,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布途茫。 她就那樣靜靜地躺著,像睡著了一般溪食。 火紅的嫁衣襯著肌膚如雪囊卜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天错沃,我揣著相機與錄音栅组,去河邊找鬼。 笑死枢析,一個胖子當著我的面吹牛符衔,可吹牛的內容都是我干的听绳。 我是一名探鬼主播沦辙,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼消痛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了把沼?” 一聲冷哼從身側響起啊易,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饮睬,沒想到半個月后租谈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡捆愁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年割去,在試婚紗的時候發(fā)現(xiàn)自己被綠了窟却。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呻逆,死狀恐怖夸赫,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情咖城,我是刑警寧澤茬腿,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站酒繁,受9級特大地震影響滓彰,放射性物質發(fā)生泄漏控妻。R本人自食惡果不足惜州袒,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弓候。 院中可真熱鬧郎哭,春花似錦、人聲如沸菇存。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽依鸥。三九已至亥至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贱迟,已是汗流浹背姐扮。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衣吠,地道東北人茶敏。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像缚俏,于是被迫代替她去往敵國和親惊搏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容