瀏覽器行為模擬之requests、selenium模塊


                                           

            requests模塊

 

前言:

通常我們利用Python寫一些WEB程序、webAPI部署在服務端,讓客戶端request,我們作為服務器端response數據;

但也可以反主為客利用Python的requests模塊模擬瀏覽器行為,向其他站點發送request,讓其他站點response數據給我們;

 

一、requests模塊介紹

requests可以模擬瀏覽器的請求,比起之前用到的urllib,requests模塊的api更加便捷(其本質就是封裝了urllib3),

特點:requests庫發送請求將網頁內容下載下來以后,並不會執行js代碼,這需要我們自己分析目標站點然后發起新的request請求

官網鏈接:http://docs.python-requests.org/en/master/

 

1、安裝requests模塊

pip3 install requests

 

2、requests模塊支持的請求方式

常用的就是requests.get()和requests.post(),建議在正式學習requests前,先熟悉下HTTP協議;http://www.cnblogs.com/linhaifeng/p/6266327.html

>>> import requests
>>> r = requests.get('https://api.github.com/events')   
>>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})
>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('http://httpbin.org/delete')
>>> r = requests.head('http://httpbin.org/get')
>>> r = requests.options('http://httpbin.org/get')

 

二、requests發送GET請求

 1、基本get請求

1 import requests
2 response=requests.get('http://dig.chouti.com/')
3 print(response.text)

 

response查看response編碼

respose.encoding:查看返回網頁數據默認編碼

import requests

url='https://www.baidu.com/'
respose=requests.get(
             url=url,
             headers={
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'
             })

print(respose.encoding)#查看網頁編碼
respose.encoding='utf-8' #設置網頁編碼
print(respose.status_code)
with open('a.html','w',encoding='utf-8') as f:
    f.write(respose.text)
View Code

 

 

2、帶參數的GET請求

 url編碼

#帶參數的url,+url編碼
from urllib.parse import urlencode
import requests
k=input('輸入關鍵字:  ').strip()
res=urlencode({'wd':k},encoding='utf-8')  #url編碼
respose=requests.get('https://www.baidu.com/s?%s'% res,
                     headers={
                    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'
                     },
                     # params={'wd':k}


                     )
with open('a.html','w',encoding='utf-8') as f:
    f.write(respose.text)
View Code

 

headers設置請求頭

respose=requests.get('https://www.baidu.com/s?%s'% res,
                     headers={
                    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'
                     },
View Code

 

params 請求參數設置(自動處理URL后參數編碼)

k=input('輸入關鍵字:  ').strip()
# res=urlencode({'wd':k},encoding='utf-8')  #url編碼
respose=requests.get('https://www.baidu.com/s?',
                     headers={
                    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'
                     },
                     params={'wd':k}


                     )
with open('a.html','w',encoding='utf-8') as f:
    f.write(respose.text)
View Code

 

Cookies 請求攜帶cookie信息

respose=requests.get('https://www.baidu.com/s?',
                     headers={
                    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'
                     },
                     params={'wd':k},
                     Cookies={'user_session':'wGMHFJKgDcmRIVvcA14_Wrt_3xaUyJNsBnPbYzEL6L0bHcfc'},

                     )
View Code

 

allow_redirects=False   禁止根據resposes的響應頭的location做頁面跳轉,默認是true跳轉;

設置為flase可以停留在本次請求(request),獲取本次響應(responses)響應頭,讓跳轉的loction地址;否則跳轉了獲取得就是跳轉之后頁面的響應內容了!

 

r3=session.get('https://passport.lagou.com/grantServiceTicket/grant.html',
               headers={
                   'Referer':'//passport.lagou.com/login/login.html',
                   'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
                   'Host':'passport.lagou.com',
                    },
               allow_redirects = False  # 禁止授權完成之后,禁止做頁面跳轉
               ,

               )
View Code

 

 

 

 

小結:

 

 

 

三、requests發送POST請求

1、get請求和post請求的區別

GET請求:HTPP默認的請求方式是GET;

GETt請求的特點:

  *沒有請求體,攜帶數據保存在URL后面

  *GET請求攜帶的參數必須在1k之內

  *GET請求的攜帶的數據由於封裝在URL后面,所以會暴露在瀏覽器地址欄中

 

POST請求:用戶先server端提交上傳數據一般會使用POST請求

POST請求的特點:

 *有請求體,數據保存在請求體中

 *上傳提交的數據無上限

 *請求體中如果存在中文,會使用URL編碼!

 

小結:

requests.post()用法與requests.get()完全一致,特殊的是requests.post()有一個data參數,用來存放請求體數據,也就是POST請求的請求體;

 

 

 2、發送post請求,模擬瀏覽器的登錄github

import requests
import re

#訪問登錄頁面
r1=requests.get('https://github.com/login/',
                     headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'},

                     )

authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text,re.S)[0]
# print(r1.cookies.items()) #獲取元祖類型的cookies信息
# print(r1.cookies.get_dict())#獲取字典類型的cokies信息
cookies=r1.cookies.get_dict()


#訪問登錄頁面
r2=requests.post('https://github.com/session',
    data={
    'commit':'Sign in',
    'utf8':'',
    'authenticity_token':authenticity_token,
    'login':'13220198866@163.com',
    'password':'123.com'},
    headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'},
    cookies=cookies)


#訪問設置個人主頁
cookies2=r2.cookies.get_dict() #獲取登錄頁面返回的cokies信息
r3=requests.get('https://github.com/settings/emails',cookies=cookies2)

print('13220198866@163.com' in r3.text  )
View Code

 

3、使用request.post() 之 content-type

requests.post(url='xxxxxxxx',
              data={'xxx':'yyy'}) #沒有指定請求頭,#默認的請求頭:application/x-www-form-urlencoed

#如果需要向server端傳說json數據,必須設置 content-ype:application/json,並且用data傳值, 否則服務端取不到值
requests.post(url='',
              data={'':1,},
              headers={
                  'content-type':'application/json'
              })


、

 

 

 

四 、requests模塊的響應Response

當我們使用requets模塊,發送了正確GET/POST請求之后,服務端勢必會給我們一個response(響應內容)

 

1、response屬性

respose=requests.get('http://www.cnblogs.com/sss4/')
print(respose.text)  #顯示文本內容
print(respose.content) #顯示二進制內容(比如爬 圖片 或視頻需要)
print(respose.status_code) #返回的狀態碼
print(respose.headers) #獲取響應頭
print(respose.cookies) #獲取服務端響應的cokies信息
print(respose.cookies.get_dict()) #獲取字典形式的cokies信息
print(respose.cookies.items()) #獲取列表類型的cookis信息
print(respose.url) #獲取請求的URLhttp://www.cnblogs.com/sss4/
print(respose.history)#獲取跳轉前的url
print(respose.json()) #獲取json數據
respose.encoding='gbk'#設置 requests模塊的編碼

 

 

 

 

五、requests模塊的高級用法

 

1、SSL Cert Verification(驗證證書)

大家平時訪問某網站的時候,URL是以https開頭的,這是為什么呢?
https是http+ssl協議:基於證書校驗的http協議

世界上有一個專門負責為瀏覽器頒發證書的CA機構

某些網站會去CA中心買1個數字證書,這樣瀏覽器每次去訪問該網站都會去訪問權威CA機構,獲取該證書攜帶該證書過去訪問該網站;

還有一類網站不願去花錢去CA購買權威的證書,自己搭建了一個頒發證書的CA,這些CA中心是不被瀏覽器認可的,所以每次訪問這些網站的時候,瀏覽器會去私有證書頒發機構獲取證書,瀏覽器會提示用戶這是一個不安全的鏈接,讓用戶選擇處理;


我們在做爬蟲的時候如何繞過證書驗證環節呢?

 

情況1:不再證書驗證

不做證書驗證的情況,在某些情況下是行不通的的;

除非某些網站購買的是權威的CA證書,已經和瀏覽器和操作系統做了合作下載瀏覽器時把證書自帶下載好了;(提升了用戶體驗,也提升了安全性。)

另外一種情況是 雖然該網站做了證書驗證,但是不使用https協議也能正常登錄;(用戶體驗為上)


verify=False 代表不做證書驗證

#證書驗證(大部分網站都是https)
import requests
respone=requests.get('https://www.12306.cn') #如果是ssl請求,首先檢查證書是否合法,不合法則報錯,程序終端
View Code


去掉報錯,並且去掉警報信息

import requests
from requests.packages import urllib3
urllib3.disable_warnings() #關閉警告
respone=requests.get('https://www.12306.cn',verify=False)
print(respone.status_code)
View Code

 

 

情況2:必須做用戶證書驗證的網站

但是一些網站必須硬性要求瀏覽器攜帶證書,比如12306這種剛需網站,如何破?(安全至上)

import requests
respone=requests.get('https://www.12306.cn',
                     cert=('/path/server.crt',
                           '/path/key'))
print(respone.status_code)
View Code

 

 

 2、使用爬蟲代理

如果你使用爬某網站的頻率過高,IP會被該網站封掉,如何破?找一個代理使用別人的IP地址去訪問

#官網鏈接: http://docs.python-requests.org/en/master/user/advanced/#proxies

#代理設置:先發送請求給代理,然后由代理幫忙發送(封ip是常見的事情)
import requests
proxies={
    'http':'http://egon:123@localhost:9743',#帶用戶名密碼的代理,@符號前是用戶名與密碼
    'http':'http://localhost:9743',
    'https':'https://localhost:9743',
}
respone=requests.get('https://www.12306.cn',
                     proxies=proxies)

print(respone.status_code)



#支持socks代理,安裝:pip install requests[socks]
import requests
proxies = {
    'http': 'socks5://user:pass@host:port',
    'https': 'socks5://user:pass@host:port'
}
respone=requests.get('https://www.12306.cn',
                     proxies=proxies)

print(respone.status_code)
View Code

 

3、超時設置

import requests


result=requests.get('https://www.baidu.com/',timeout=0.0001 )  #timeout=0.0001 代表 請求+接收服務端數據的總時間;

#如果想明確控制  連接 和 等待接收服務端數據的時間timeout=(1,2))
result2=requests.get('https://www.baidu.com/',timeout=(1,2)) #timeout=(0.1,0.2)#0.1代表鏈接超時時間  0.2代表接收數據的超時時間
View Code

 

4、 認證設置

爬取公司內網需要輸入用戶名和密碼的 內網 例如:監控系統、樂視人(線上報銷)

#官網鏈接:http://docs.python-requests.org/en/master/user/authentication/

#認證設置:登陸網站是,彈出一個框,要求你輸入用戶名密碼(與alter很類似),此時是無法獲取html的
# 但本質原理是拼接成請求頭發送
#         r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
# 一般的網站都不用默認的加密方式,都是自己寫
# 那么我們就需要按照網站的加密方式,自己寫一個類似於_basic_auth_str的方法
# 得到加密字符串后添加到請求頭
#         r.headers['Authorization'] =func('.....')

#看一看默認的加密方式吧,通常網站都不會用默認的加密設置
import requests
from requests.auth import HTTPBasicAuth
r=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
print(r.status_code)

#HTTPBasicAuth可以簡寫為如下格式
import requests
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)
View Code

 

5、requests模塊自帶異常處理

#異常處理
import requests
from requests.exceptions import * #可以查看requests.exceptions獲取異常類型

try:
    r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
    print('===:')
# except ConnectionError: #網絡不通
#     print('-----')
# except Timeout:
#     print('aaaaa')

except RequestException:
    print('Error')
View Code

 

6、使用requests模塊上傳文件

import requests
files={'file':open('a.jpg','rb')}
respone=requests.post('http://httpbin.org/post',files=files)
print(respone.status_code)
View Code

 

 

六、requests.session()方法

每次寫爬蟲都要在響應頭中獲取cokies信息,然后在把獲取的cokies信息加在請求頭,太繁瑣了;

如果有了 requests.session()對象,就可以自動處理cokies問題了;

session= requests.session()  #相當於設置了 一個會話相關的容器,把所有會話相關的cookie都存放起來(自動保存cookie問題)
r1=session.get('https://github.com/login/',
                     headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'},

                     )

authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text,re.S)[0]
View Code

 

瞎驢博客:

http://www.cnblogs.com/linhaifeng/articles/7785043.html

 

 

 

 

 

                                               selenium模塊

 

前言:

由於requests模塊是一個不完全模擬瀏覽器行為的模塊,只能爬取到網頁的HTML文檔信息,無法解析和執行CSS、JavaScript代碼,因此需要我們做人為判斷;

selenium模塊本質是通過驅動瀏覽器完全模擬瀏覽器的操作,比如跳轉、輸入、點擊、下拉等,來拿到網頁渲染之后的結果,可支持多種瀏覽器;由於selenium解析執行了CSS、JavaScript所以相對requests它的性能是低下的;

 

 

一、安裝selenium+chromdriver.exe

1.安裝selenium

pip install selenium

 

 2.下載chromdriver.exe放置python安裝路徑/scripts目錄下

下載chromdriver.exe放到python安裝路徑的scripts目錄中即可,注意最新版本是2.29,並非2.9
國內鏡像網站地址:http://npm.taobao.org/mirrors/chromedriver/2.29/
最新的版本去官網找:https://sites.google.com/a/chromium.org/chromedriver/downloads

 

3.測試是否安裝成功

from selenium import webdriver
browser=webdriver.Chrome()                #實例化1個谷歌瀏覽器對象
browser.get('https://www.baidu.com/')     #開始

 

 

 二、selenium基本使用

import time
from selenium import webdriver#驅動瀏覽器
from selenium.webdriver import ActionChains #滑動
from selenium.webdriver.common.by import By #選擇器
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
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() #調用Chrome 驅動,生成瀏覽器對象
wait=WebDriverWait(browser,10) #設置selenium等待瀏覽器加載完畢的最大等待時間

try:
    browser.get('https://www.baidu.com/')
    baidu_input_tag=browser.find_element_by_id("kw")  #尋找到百度頁面的id='kw'的標簽
    key=baidu_input_tag.send_keys('張根')             #在標簽中輸入'張根'

    baidu_button_tag=browser.find_element_by_id('su') #尋找到百度頁面id='su'的標簽
    baidu_button_tag.click()                           #點擊
    wait.until(EC.presence_of_element_located((By.ID,'4')))  #等待百度頁面 ID='4'的標簽完畢,最大等待10秒
    '''
請求相關:
browser.get('url')
 
         
    響應相關:
    print(browser.page_source) #顯示網頁源碼
    print(browser.current_url)   #獲取當前url
    print(browser.get_cookies()) #獲取當前網頁cokies
    '''

finally:
    time.sleep(5)
    browser.close()      #關閉瀏覽器

 

 

 三、selenium選擇器

 模擬瀏覽器無非請求---->顯示頁面----->尋找標簽 ------>點擊標簽的事件,所以selenium的關鍵是怎么找到頁面中的標簽,進而觸發標簽事件;

 

1.通過標簽id屬性進行定位

browser.find_element(By.ID,'kw').send_keys("美女")
browser.find_element_by_id('kw').send_keys('性感')

 

 2.通過標簽name屬性進行定位

browser.find_element_by_name("wd").send_keys("Linux")
browser.find_element(By.NAME,'wd').send_keys("美女")

 

3.通過標簽名進行定位

 browser.find_element_by_tag_name("input").send_keys("selenium")
 browser.find_element(By.TAG_NAME, 'input').send_keys('aaa')

 

4.通過CSS查找方式進行定位

browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python django')
browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python 之美')

 

5.通過xphan方式定位

browser.find_element_by_xpath('//*[@id="kw"]').send_keys("python Tornado")
browser.find_element(By.XPATH, '//*[@id="kw"]').send_keys('吐槽大會')

 

6.通過搜索 頁面中 鏈接進行定位

有時候不是一個輸入框也不是一個按鈕,而是一個文字鏈接,我們可以通過link

browser.find_element_by_link_text("新聞").click()

 

7.通過搜索 頁面中 鏈接進行定位 ,可以支持模糊匹配

browser.find_element_by_partial_link_text("").click()
browser.find_element_by_partial_link_text("").click()

 

8.小結

上述均可以改寫成find_element(By.ID,'kw')的形式

find_elements_by_xxx的形式是查找到多個元素,結果為列表

import time
from selenium import webdriver#驅動瀏覽器
from selenium.webdriver import ActionChains #滑動
from selenium.webdriver.common.by import By #選擇器
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
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() #調用Chrome 驅動,生成瀏覽器對象
wait=WebDriverWait(browser,10) #設置selenium等待瀏覽器加載完畢的最大等待時間

try:
    browser.get('https://www.baidu.com/')


    #通過標簽id屬性進行定位
    # browser.find_element(By.ID,'kw').send_keys("美女")
    # browser.find_element_by_id('kw').send_keys('性感')

    #通過標簽name屬性進行定位
    # browser.find_element_by_name("wd").send_keys("Linux")
    # browser.find_element(By.NAME,'wd').send_keys("美女")

    #通過標簽名稱進行定位
    # browser.find_element_by_tag_name("input").send_keys("selenium")
    # browser.find_element(By.TAG_NAME, 'input').send_keys('aaa')

    # 通過CSS查找方式進行定位
    # browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python django')
    # browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('泰山')

    # 通過xphan方式定位
    # browser.find_element_by_xpath('//*[@id="kw"]').send_keys("python Tornado")
    # browser.find_element(By.XPATH, '//*[@id="kw"]').send_keys('吐槽大會')

    # 通過搜索 頁面中 鏈接進行定位
    # browser.find_element_by_link_text("新聞").click()

    #通過搜索 頁面中 鏈接進行定位 ,可以支持模糊匹配
    # browser.find_element_by_partial_link_text("新").click()
    # browser.find_element_by_partial_link_text("聞").click()


finally:
    browser.find_element_by_id("su").click()
    time.time(3)
    browser.close()  # 關閉瀏覽器browser.quit()
示例

 

 四、等待元素被加載

#1、selenium只是模擬瀏覽器的行為,而瀏覽器解析頁面是需要時間的(執行css,js),一些元素可能需要過一段時間才能加載出來,為了保證能查找到元素,必須等待

#2、等待的方式分兩種:
wait=WebDriverWait(browser,10) #顯式等待
wait1=browser.implicitly_wait(10) #隱式等待
wait.until(EC.presence_of_element_located((By.CLASS_NAME,'tH0')))
'''
顯式等待:指定等待某個標簽加載完畢
隱式等待:等待所有標簽加載完畢

'''

 

 

五、元素交互操作

0.ActionChains(動作鏈)

用selenium做自動化,有時候會遇到需要模擬鼠標操作才能進行的情況(如:iframe標簽),比如單擊、雙擊、點擊鼠標右鍵、拖拽(滑動驗證)等等。而selenium給我們提供了一個類來處理這類事件——ActionChains;

#iframe標簽切換
# 如果網頁頁面嵌套frame標簽,子頁面訪問不到父頁面的內容,父頁面也訪問不到子頁面的內容所以需要切換;


from selenium import webdriver
from selenium.webdriver import ActionChains #鼠標鍵盤動作鏈
from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys  # 鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait  # 等待頁面加載某些元素
import time

browser=webdriver.Chrome()
wait1=WebDriverWait(browser,10)
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')

browser.switch_to.frame('iframeResult')#切換到id='iframewrapper'的iframe子標簽

action_chains=ActionChains(browser) #實例化1個動作鏈隊列

source=browser.find_element_by_id('draggable') #找到拖拽的源標簽
target=browser.find_element_by_id('droppable')#找到拖拽的目標標簽

action_chains.drag_and_drop(source,target).perform()#把動作放到動作鏈中,perform()准備串行執行;

'''
click(on_element=None) ——單擊鼠標左鍵

click_and_hold(on_element=None) ——點擊鼠標左鍵,不松開

context_click(on_element=None) ——點擊鼠標右鍵

double_click(on_element=None) ——雙擊鼠標左鍵

drag_and_drop(source, target) ——拖拽到某個元素然后松開

drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某個坐標然后松開

key_down(value, element=None) ——按下某個鍵盤上的鍵

key_up(value, element=None) ——松開某個鍵

move_by_offset(xoffset, yoffset) ——鼠標從當前位置移動到某個坐標

move_to_element(to_element) ——鼠標移動到某個元素

move_to_element_with_offset(to_element, xoffset, yoffset) ——移動到距某個元素(左上角坐標)多少距離的位置

perform() ——執行鏈中的所有動作

release(on_element=None) ——在某個元素位置松開鼠標左鍵

send_keys(*keys_to_send) ——發送某個鍵到當前焦點的元素

send_keys_to_element(element, *keys_to_send) ——發送某個鍵到指定元素
'''

time.sleep(5)
browser.quit()
ActionChains動作鏈示例

 

關於ActionChains參看:http://blog.csdn.net/huilan_same/article/details/52305176

 

1.點擊,清空

import time
from selenium import webdriver#驅動瀏覽器
from selenium.webdriver import ActionChains #滑動
from selenium.webdriver.common.by import By #選擇器
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
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() #調用Chrome 驅動,生成瀏覽器對象
wait=WebDriverWait(browser,10) #設置selenium等待瀏覽器加載完畢的最大等待時間

browser.get('https://www.baidu.com/')
browser.find_element(By.ID,'kw').send_keys("美女")
browser.find_element_by_id("su").click()#點擊按鈕
time.sleep(4)
browser.find_element(By.ID,'kw').clear()#清空input標簽中的內容,讓重新輸入
browser.find_element_by_id('kw').send_keys('性感')
browser.find_element_by_id("su").click() #點擊按鈕
點擊和清空

 

 2.前進和后退

import time
from selenium import webdriver#驅動瀏覽器
from selenium.webdriver import ActionChains #滑動
from selenium.webdriver.common.by import By #選擇器
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC  #等待所有標簽加載完畢
from selenium.webdriver.support.wait import WebDriverWait #等待頁面加載完畢 尋找某些元素
import time
from selenium import webdriver

browser=webdriver.Chrome()
browser.get('http://www.cnblogs.com/sss4/')

browser.find_element_by_partial_link_text( 'PythonWEB框架之Flask').click()

time.sleep(3)
browser.back() #后退
time.sleep(3)
browser.forward() #前進
time.sleep(5)
browser.close()
示例

 

3.cokies相關

import time
from selenium import webdriver#驅動瀏覽器
from selenium.webdriver import ActionChains #滑動
from selenium.webdriver.common.by import By #選擇器
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC  #等待所有標簽加載完畢
from selenium.webdriver.support.wait import WebDriverWait #等待頁面加載完畢 尋找某些元素


from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())                    #獲取cokies信息
browser.add_cookie({'k1':'xxx','k2':'yyy'}) #添加cokies信息
print(browser.get_cookies())

browser.delete_all_cookies()                   #刪除cokies信息,慎用
示例

 

4.選項卡管理

 

from selenium import webdriver

browser=webdriver.Chrome()


browser.execute_script('window.open()') #打開選項卡
browser.execute_script('window.open()')


print(browser.window_handles)             #獲取所有的選項卡

browser.switch_to_window(browser.window_handles[0]) #切換至選項卡0
browser.get('https://www.taobao.com')


browser.switch_to_window(browser.window_handles[1]) #切換至選項卡1
browser.get('https://www.baidu.com')

browser.switch_to_window(browser.window_handles[2]) #切換至選項卡2
browser.get('https://v.qq.com/')
示例

 

5.selenium異常處理

from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException

try:
    browser=webdriver.Chrome()
    browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    browser.switch_to.frame('iframssseResult')

except TimeoutException as e:
    print(e)
except NoSuchFrameException as e:
    print(e)
finally:
    browser.close()
示例

 

 

 參考:

 http://www.cnblogs.com/linhaifeng/articles/7783599.html

https://www.cnblogs.com/fnng/p/3183777.html

http://www.cnblogs.com/wupeiqi/articles/6283017.html

 

 

 

                                      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM