最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用python-webdriver實(shí)現(xiàn)自動填表的示例代碼

 更新時間:2021年01月13日 10:28:36   作者:luozx207  
這篇文章主要介紹了用python-webdriver實(shí)現(xiàn)自動填表的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

 在日常工作中常常需要重復(fù)填寫某些表單,如果人工完成,費(fèi)時費(fèi)力,而且網(wǎng)絡(luò)延遲令人十分崩潰。如果能夠用程序?qū)崿F(xiàn)自動填表,效率可以提高一倍以上,并且能夠移植到多臺計(jì)算機(jī),進(jìn)一步提高工作效率。webdriver是python的selenium庫中的一個自動化測試工具,它能完全模擬瀏覽器的操作,無需處理復(fù)雜的request、post,對爬蟲初學(xué)者十分友好。

一、環(huán)境配置

  python3.6+selenium庫+xlrd庫+xlwt庫

  其中xlrd和xlwt庫用于讀寫excel表中的數(shù)據(jù)。

  還要下載一個瀏覽器的driver文件用于打開瀏覽器,注意要選擇與計(jì)算機(jī)系統(tǒng)相符合的版本(max/windows64位/windows32位)

  ChromeDriver:http://npm.taobao.org/mirrors/chromedriver/

     IEDriver:http://selenium-release.storage.googleapis.com/index.html

  將下載下來的driver.exe放到瀏覽器根目錄和python的根目錄

二、打開網(wǎng)頁

  以IE瀏覽器為例,以下兩行代碼就可以實(shí)現(xiàn)打開一個IE瀏覽器并且訪問我們需要填表的網(wǎng)站

driver= webdriver.Ie()
driver.get('http://xxxx.com/')

  如果網(wǎng)站需要登陸(需要填表的一般是公司內(nèi)部網(wǎng)站),再寫一個login函數(shù),將driver作為參數(shù)調(diào)用

driver = login(driver)

     注意一定要將driver傳回,這樣driver才能繼續(xù)接受程序的指令

三、元素定位

  webdriver的工作原理是找到網(wǎng)頁中某一個元素,可以對其進(jìn)行填入數(shù)據(jù)或點(diǎn)擊等操作。

  關(guān)于元素定位可以參考這篇博客

  我主要用到的元素定位方式有

driver.find_element_by_id('someid')#通過元素的id定位
driver.find_element_by_css_selector("input[value='確定'")#查找一個input元素,它的value屬性值為'確定'
driver.find_element_by_xpath("http://span[contains(@style,'COLOR: red')]/span[1]")#查找一個style屬性值為'COLOR:red'的span元素的第一個span子元素

 (1)通過id定位

  如果我們想在網(wǎng)頁表單的某一個位置填某項(xiàng)值或者點(diǎn)擊某個按鈕,我們首先要用開發(fā)者工具查看這個元素的源代碼,然后首先觀察它有沒有id,如果有id,直接用id定位該元素。然后,用

driver.find_element_by_id('someid').click()#點(diǎn)擊元素
driver.find_element_by_id('someid').send_keys('somekeys')#填入'somekeys'
driver.find_element_by_id('someid').clear()#清空輸入框中已有的值

  實(shí)現(xiàn)我們想要做的操作。

 (2)通過ccs selector定位

  如果我們想要操作的元素沒有ID,那么我們就要找到它跟網(wǎng)頁其他元素不同的特征,ccs selector是一種十分靈活的定位方式,其中用value定位是一個不錯的選擇。以

driver.find_element_by_css_selector("input[value='確定'")

  為例,雙引號中的input可以換成任何網(wǎng)頁元素(div、span、input、a等),中括號中是該元素的某一個屬性(style、id、value、class等),等號后面是該屬性的值。

  注意,如果網(wǎng)頁中有多個元素同時滿足ccs selector的條件,如有多個value=“確定” 的input,那么find_element_by_css_selector只會定位到在html源代碼中最靠前的一個,而find_elements_by_css_selector會找到源代碼中所有滿足條件的元素,并以列表的形式返回這些找到的元素。例如,網(wǎng)頁中彈出很多個提示框,我們要一一去點(diǎn)確定,可以這樣操作

list=driver.find_elements_by_css_selector("input[value=' 確定 ']")
for l in list:
l.click()

  但是,如果這些提示框是重疊出現(xiàn)的,而最上層的提示框?qū)嶋H上在源碼中更靠后的位置,那么列表中第一個“確定”元素就會被疊在上面的提示框遮擋,無法點(diǎn)擊,這個時候倒序一下數(shù)組就可以了,從最后一個“確定”元素開始點(diǎn)擊

query=driver.find_elements_by_css_selector("input[value=' 確定 ']")
for q in query[::-1]:
q.click()

(3)通過xpath定位

  xpath定位比較復(fù)雜但是非常全面,當(dāng)這個元素的class、style屬性和其他元素一樣,實(shí)在沒什么特點(diǎn)可以一步定位的時候,我們就可以用xpath,先找到我們想要的元素的父子兄弟元素,再定位到我們想要的元素。例如

driver.find_element_by_xpath('//*[@class="submit clear"]/input[1]').click()
text =driver.find_element_by_xpath("http://input[@value=' 確定 ']/../preceding-sibling::div[1]").text
driver.find_elements_by_xpath("http://span[contains(@style,'COLOR: red')]/span[1]")

  引號中的//表示相對定位,表示從源代碼中任何地方開始尋找。

  //后可以跟任何元素,*代表任意元素,即定位符合屬性篩選任何元素。

  中括號內(nèi)是屬性的篩選條件,@后可以加任意屬性。contains(@style,'COLOR: red')表示的篩選條件是:style屬性中包含”COLOR:red“。這里為什么不直接用@style='COLOR: red'

的原因是,可能在我們審查源代碼的時候這個元素的style屬性只有'COLOR: red'這一條,但是動態(tài)界面的style屬性經(jīng)常變化,程序運(yùn)行時直接用等于是定位不到這個元素的。

  我們通常需要靠先找到某個有id的元素,再通過層級關(guān)系定位到我們真正想要定位的元素,關(guān)于兄弟父子元素定位請參考http://m.fzitv.net/article/92673.htm

  /..  可以定位這個元素的父親元素

  /  可以定位這個元素的子元素

  /preceding-sibling::  可以定位這個元素的哥哥元素

  /following-sibling::  可以定位這個元素的弟弟元素

  如/input[1]表示子元素中第一個input、/../preceding-sibling::div[1]表示父元素的哥哥元素中的第一個div

 (4)通過當(dāng)前節(jié)點(diǎn)定位

  有時候我們會遇到需要判斷一下元素當(dāng)前的狀態(tài)(是否被選擇)再決定接下來的操作的情況,這時就需要用一個變量來保存當(dāng)前節(jié)點(diǎn)  

LTE=driver.find_element_by_xpath("http://input[@id='LTE']/../span[1]"

  然后再用get_attribute獲得當(dāng)前節(jié)點(diǎn)元素的屬性,在這個例子里,如果元素為藍(lán)色,就不需要點(diǎn)擊。代碼實(shí)現(xiàn)為:

if LTE.get_attribute("style")=="COLOR: blue":
 pass
 else:
 LET.click()

  需要篩選出特定文本的情況:

 red=driver.find_elements_by_xpath("http://span[contains(@style,'COLOR: red')]/span[1]")#找出所有紅色的文本
 for r in red:
 if '低消' in r.text:#如果文本信息中包含‘低消'
  r.find_element_by_xpath("./../preceding-sibling::input[1]").click()#注意從當(dāng)前節(jié)點(diǎn)定位的時候要以‘./'開頭
  break

  如果尋找的元素需要滾動界面才能看到,這個時候可以用js聚焦此元素,頁面便會滾動到該元素的位置

 target=driver.find_element_by_css_selector("input[value=' 確定 ']")
 driver.execute_script("arguments[0].scrollIntoView();", target)
 target.click()

四、不確定情況處理

 (1)有可能出現(xiàn)的彈窗

  在填表過程中,有些地方有可能出現(xiàn)一個彈框也有可能不出現(xiàn),這個時候,無論這個彈窗是什么,用try..except語句處理就可以解決

  js觸發(fā)的彈窗:

 try:
 driver.find_element_by_css_selector("input[value=' 確定 ']").click()
 except Exception as e:
 pass

  網(wǎng)頁alert彈窗:

 try:
 driver.switch_to.alert.dismiss()
 except Exception:
 pass

  dismiss()對應(yīng)的是alert彈窗的”取消“項(xiàng),accept()對應(yīng)的是”確定“項(xiàng),driver.switch_to.alert.text 可以獲得彈窗的文本內(nèi)容。

 (2)數(shù)量不定的彈窗

  對上文提到的多個提示框情況,除了用 query=driver.find_elements_by_css_selector("input[value=' 確定 ']") 一次性找到所有元素再順序或倒序點(diǎn)擊之外,還可以用一個while循環(huán)解決

 while(1):
 try:
  driver.find_element_by_css_selector("input[value=' 確定 ']").click()
 except Exception as e:
  break

 (3)網(wǎng)絡(luò)延遲

  有些網(wǎng)頁在點(diǎn)擊查詢信息之后需要加載一段時間,加載中的頁面是找不到我們接下來想找的元素的,因此程序就會報錯,此時有兩種解決方法。

  一種是固定等待一段時間,等待網(wǎng)頁加載完畢,這種方法的缺點(diǎn)是很難找到等待的最佳時間,太短的話頁面還沒加載完,太長就影響效率

time.sleep(2)

  另一種是用一個while循環(huán)一直尋找下一個我們要找的元素

 while(1):
 try:
  driver.find_element_by_id('continueTrade').click()
  break
 except Exception:
  pass

  這種方法的前提是下一個要找的元素必定會出現(xiàn) 

五、frame處理

  關(guān)于frame處理這篇博客寫得非常好http://m.fzitv.net/article/203425.htm

  總結(jié)起來就是:frameset不用切,frame層層切。最好一系列填表操作完后都用 driver.switch_to.default_content() 回到原文檔,這樣不容易混亂

  這里再補(bǔ)充一點(diǎn)frame沒有id時的切入方法

 frame= self.driver.find_element_by_xpath("/html/body/div[12]/iframe")#先定位frame位置,用一個變量儲存這個節(jié)點(diǎn)
 self.driver.switch_to_frame(frame)#再切入這個節(jié)點(diǎn)

六、excel數(shù)據(jù)讀寫

  excel數(shù)據(jù)讀寫十分簡單,看代碼就好了:

def read(file):
 data = xlrd.open_workbook(file)#打開excel文件
 table = data.sheets()[0]#讀取第一個sheet的數(shù)據(jù)
 phones = table.col_values(0)#以列表形式存儲第一列數(shù)據(jù)
 peoples = table.col_values(1)#以列表形式存儲第二列數(shù)據(jù)

 return phones,peoples

def write(result):
 file=xlwt.Workbook()#創(chuàng)建一個excel文件
 table = file.add_sheet('sheet1')#添加一個sheet
 for i in range(len(result)):#寫入數(shù)據(jù)
 table.write(i,0,result[i][0])
 table.write(i,1,result[i][1])
 table.write(i,2,result[i][2])
 file.save('result.xls')

到此這篇關(guān)于用python-webdriver實(shí)現(xiàn)自動填表的示例代碼的文章就介紹到這了,更多相關(guān)python webdriver 自動填表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)簡單層次聚類算法以及可視化

    Python實(shí)現(xiàn)簡單層次聚類算法以及可視化

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡單層次聚類算法以及可視化,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Python?避免字典和元組的多重嵌套問題

    Python?避免字典和元組的多重嵌套問題

    這篇文章主要介紹了Python?避免字典和元組的多重嵌套,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Windows下Anaconda安裝、換源與更新的方法

    Windows下Anaconda安裝、換源與更新的方法

    這篇文章主要介紹了Windows下Anaconda安裝、換源與更新的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 在阿里云服務(wù)器上配置CentOS+Nginx+Python+Flask環(huán)境

    在阿里云服務(wù)器上配置CentOS+Nginx+Python+Flask環(huán)境

    這篇文章主要介紹了在阿里云服務(wù)器上配置CentOS+Nginx+Python+Flask環(huán)境的教程,值得一提的是這里的方案用Nginx作反向代理而使用Gunicorn作wsgi服務(wù)器,需要的朋友可以參考下
    2016-06-06
  • Python實(shí)現(xiàn)批量修改文件時間屬性

    Python實(shí)現(xiàn)批量修改文件時間屬性

    我們有時候需要修改文件的“修改時間”?、?“訪問時間”,“創(chuàng)建時間”?,此時如果使用Python批量實(shí)現(xiàn)應(yīng)該會方便很多,下面小編就來為大家介紹一下具體實(shí)現(xiàn)方法吧
    2023-11-11
  • 詳解Python之Scrapy爬蟲教程N(yùn)BA球員數(shù)據(jù)存放到Mysql數(shù)據(jù)庫

    詳解Python之Scrapy爬蟲教程N(yùn)BA球員數(shù)據(jù)存放到Mysql數(shù)據(jù)庫

    這篇文章主要介紹了詳解Python之Scrapy爬蟲教程N(yùn)BA球員數(shù)據(jù)存放到Mysql數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 開源Web應(yīng)用框架Django圖文教程

    開源Web應(yīng)用框架Django圖文教程

    Python下有許多款不同的 Web 框架。Django是重量級選手中最有代表性的一位。許多成功的網(wǎng)站和APP都基于Django。Django是一個開放源代碼的Web應(yīng)用框架,由Python寫成。下面我們來一步步學(xué)習(xí)下吧
    2017-03-03
  • 詳解Python操作Excel之openpyxl

    詳解Python操作Excel之openpyxl

    這篇文章主要為大家介紹了Python操作Excel的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python操作Elasticsearch詳細(xì)指南

    Python操作Elasticsearch詳細(xì)指南

    Elasticsearch?是一種強(qiáng)大且靈活的分布式搜索引擎,而?Python?則以其易用性和強(qiáng)大的數(shù)據(jù)處理能力,成為開發(fā)者在數(shù)據(jù)操作中的理想選擇,下面我們就來看看如何使用Python操作Elasticsearch吧
    2025-02-02
  • python 默認(rèn)參數(shù)相關(guān)知識詳解

    python 默認(rèn)參數(shù)相關(guān)知識詳解

    這篇文章主要介紹了python 默認(rèn)參數(shù)相關(guān)知識詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09

最新評論

上高县| 峨山| 高尔夫| 汝南县| 滨州市| 民勤县| 天峻县| 松潘县| 永修县| 南开区| 宁国市| 安西县| 缙云县| 巴中市| 高邑县| 穆棱市| 丹巴县| 安岳县| 板桥市| 惠安县| 岳普湖县| 永泰县| 沁源县| 玉林市| 楚雄市| 江北区| 临沧市| 浏阳市| 繁峙县| 建宁县| 大连市| 诏安县| 固安县| 呼和浩特市| 鄂伦春自治旗| 余庆县| 武平县| 苏尼特左旗| 西藏| 连云港市| 柞水县|