1 jsonPath資料格式
pip安裝: pip install jsonpath
用來解析json格式的字元串,類似于xpath
(1) json對象的轉換
json.loads()
json.dumps()
json.load()
json.dump()
#直接讀取json對象
json_obj = json.load(open('books.json','r',encoding='utf-8'))
print(json_obj)
#先讀取json字元串,再轉json對象
with open('books.json','r',encoding='utf-8') as fp:
json_str = fp.read()
json_obj = json.loads(json_str,encoding='utf-8')
print(json_obj)
(2) XPath與jsonPath格式對比
XPath | JSONPath | Description |
---|---|---|
/ | $ | 表示根元素 |
. | @ | 目前元素 |
. or [] | 子元素 | |
.. | n/a | 父元素 |
// | 遞歸下降,JSONPath是從E4X借鑒的。 | |
* | 通配符,表示所有的元素 | |
屬性通路字元 | ||
[] | 子元素操作符 | |
| | [,] | 連接配接操作符在XPath 結果合并其它結點集合。JSONP允許name或者數組索引。 |
[start:end:step] | 數組分割操作從ES4借鑒。 | |
?() | 應用過濾表示式 | |
() | 腳本表達式,使用在腳本引擎下面。 | |
Xpath分組 |
結果 | ||
---|---|---|
| | 書點所有書的作者 |
| | 所有的作者 |
| | store的所有元素。所有的bookst和bicycle |
| | store裡面所有東西的price |
| | 第三個書 |
| | 最後一本書 |
| | 前面的兩本書。 |
| | 過濾出所有的包含isbn的書。 |
| | 過濾出價格低于10的書。 |
| | 所有元素。 |
2 selenium詳解
支援通過各種driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驅動真實浏覽器完成測試 ,selenium也是支援無界面浏覽器操作的。比如說HtmlUnit和PhantomJs。
1.導入
from selenium import webdriver
2.建立谷歌浏覽器操作對象
path = 谷歌浏覽器驅動檔案路徑
browser = webdriver.Chrome(path)
3.通路網址
url = 要通路的網址
browser.get(url)
clear() #清空
4.退出浏覽器
browser.quit()
元素定位
自動化要做的就是模拟滑鼠和鍵盤來操作來操作這些元素,點選、輸入等等,包含動态加載後的結果。操作這些元素前首先要找到它們,WebDriver提供很多定位元素的方法
#通過browser對象擷取源碼
find_element_by_id #通過id
find_elements_by_name #通過name
find_elements_by_xpath #xpath路徑
find_elements_by_tag_name #标簽名
find_elements_by_class_name #類名
find_elements_by_css_selector #css樣式
find_elements_by_link_text #通過連接配接文本
my_input = browser.find_elements_by_css_selector('#kw')[0] #通過選擇器
browser.find_element_by_link_text("新聞") #通過連結文本
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.page_source # page_source 擷取源碼
driver.close() # 關閉
driver.quit() # 退出
driver.find_element_by_name('kw1') #通過name屬性查找
driver.find_element(by='name',value='kw1') #通過名字
driver.find_element_by_xpath('//input[@name="kw1"]') #通過xpath查找
kw1 = driver.find_element_by_css_selector('#wd1') #selector查找
kw1.send_keys('海賊王') #發送keys值
form_textfield = driver.find_element_by_name('username')
form_textfield.send_keys("admin")
通路元素資訊
擷取元素屬性 .get_attribute('class')
擷取元素文本 .text
擷取id .id
擷取标簽名 .tag_name
互動
# 點選click()
# 輸入send_keys()
# 模拟JS滾動
document.body.scrollTop=10000
execute_script() 執行js代碼
#示例
擷取目前頁面滾動條縱坐标的位置:
document.body.scrollTop
擷取目前頁面滾動條橫坐标的位置:
document.body.scrollLeft
執行js代碼
driver.execute_script(js_statement)
#示例
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# 下拉滾動條,使浏覽器加載出動态加載的内容
while True:
# 可能像這樣要拉很多次,中間要适當的延時
# 如果說說内容都很長,就增大下拉的長度
for i in range(10):
driver.execute_script("window.scrollBy(0,1000)") #每次下拉1000
time.sleep(3)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") #内容的總高度
break
selenium登入知乎設定代理
#設定代理
from selenium import webdriver
chromeOptions = webdriver.ChromeOptions()
# 設定代理
chromeOptions.add_argument("--proxy-server=http://10.3.132.6:808")
# 一定要注意,=兩邊不能有空格,不能是這樣--proxy-server = http://202.20.16.82:10152
browser = webdriver.Chrome(chrome_options=chromeOptions)
# 檢視本機ip,檢視代理是否起作用
browser.get("https://blog.csdn.net/zwq912318834/article/details/78626739")
print(browser.page_source)
# 退出,清除浏覽器緩存
# browser.quit()
#模拟登入知乎
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.zhihu.com/')
# 點選登陸按鈕
driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div[2]/div/div/div/div[1]/div/div[1]/div[2]/button[1]').click()
time.sleep(2)
username = driver.find_element_by_name('username')
username.send_keys('18588403840')
time.sleep(1)
password = driver.find_element_by_name('password')
password.send_keys('Changeme_123')
time.sleep(5)
# driver.find_element_by_link_text('登入').click()
driver.find_element_by_xpath('/html/body/div[4]/div/span/div/div[2]/div/div/div/div[2]/div[1]/form/button').click()
driver.get('https://www.zhihu.com/people/zuo-zai-fen-tou-diao-xi-gui-82/activities')
print(driver.page_source)
selenium模拟登陸知乎
from selenium import webdriver
import time
# http://demo.smeoa.com/
def openURL():
driver = webdriver.Chrome()
driver.get("https://user.qzone.qq.com")
time.sleep(6)
login = driver.find_element_by_id('login_frame')
driver.switch_to_frame(login)
time.sleep(3)
driver.find_element_by_id('switcher_plogin').click()
username = driver.find_element_by_id('u')
password = driver.find_element_by_id('p')
username.send_keys('*****')
password.send_keys('*****')
time.sleep(3)
driver.find_element_by_id('login_button').click()
print("OK")
if __name__ == '__main__':
openURL()
3 PhantomJS 無界面浏覽器
Headless Chrome是Chrome 浏覽器的無界面形态,可以在不打開浏覽器的前提下,使用所有 Chrome 支援的特性運作程式。相比于現代浏覽器,Headless Chrome 更加友善測試web應用,獲得網站的截圖,做爬蟲抓取資訊等,也更加貼近浏覽器環境。
Headless Chrome基于PhantomJS(QtWebKit核心)由谷歌Chrome團隊開發。團隊表示将專注研發這個項目
確定你的 chrome 浏覽器版本是 60+
配置
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
今日頭條資料滾動自動加載
from selenium import webdriver
import time
path = 'phantomjs.exe'
driver = webdriver.PhantomJS(path)
url = 'https://www.toutiao.com/'
driver.get(url)
time.sleep(2)
driver.save_scre-enshot('1.png')
js = 'document.body.scrollTop=10000'
driver.execute_script(js)
time.sleep(2)
driver.save_screenshot('2.png')
driver.quit()