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借鉴的。 |
* | * | 通配符,表示所有的元素 |
@ | n/a | 属性访问字符 |
[] | [] | 子元素操作符 |
| | [,] | 连接操作符在XPath 结果合并其它结点集合。JSONP允许name或者数组索引。 |
n/a | [start?step] | 数组分割操作从ES4借鉴。 |
[] | ?() | 应用过滤表示式 |
n/a | () | 脚本表达式,使用在脚本引擎下面。 |
() | n/a | Xpath分组 |
XPath | JSONPath | 结果 |
---|---|---|
/store/book/author |
$.store.book[*].author |
书点所有书的作者 |
//author |
$..author |
所有的作者 |
/store/* |
$.store.* |
store的所有元素。所有的bookst和bicycle |
/store//price |
$.store..price |
store里面所有东西的price |
//book[3] |
$..book[2] |
第三个书 |
//book[last()] |
$..book[(@.length-1)] |
最后一本书 |
//book[position()<3] |
$..book[0,1]``$..book[:2] |
前面的两本书。 |
//book[isbn] |
$..book[?(@.isbn)] |
过滤出所有的包含isbn的书。 |
//book[price<10] |
$..book[?(@.price<10)] |
过滤出价格低于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()