使用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 "-----"
這個地方真的花費了我好大的精力啊艘狭,讓人頭疼。