爬虫入门之jsonPath PhantomJS与 selenium详解(六)

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:end: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()

猜你喜欢

转载自blog.csdn.net/weixin_41829272/article/details/80848992
今日推荐