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

简介: 1 jsonPath数据格式pip安装: pip install jsonpath 用来解析json格式的字符串,类似于xpath(1) json对象的转换json.

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()
相关文章
|
3天前
|
数据采集 Web App开发 数据挖掘
利用Python和Selenium实现定时任务爬虫
利用Python和Selenium实现定时任务爬虫
|
3天前
|
数据采集 Web App开发 存储
Selenium库编写爬虫详细案例
Selenium库编写爬虫详细案例
|
3天前
|
数据采集 存储 前端开发
【爬虫pyspider教程】1.pyspider入门与基本使用
爬虫框架pyspider入门和基本用法。
68 0
|
3天前
|
数据采集 Web App开发 搜索推荐
突破目标网站的反爬虫机制:Selenium策略分析
突破目标网站的反爬虫机制:Selenium策略分析
|
3天前
|
数据采集 监控 前端开发
使用Python打造爬虫程序之入门探秘:掌握HTTP请求,开启你的数据抓取之旅
【4月更文挑战第19天】本文介绍了爬虫技术的基本概念和用途,阐述了HTTP协议的重要性。在Python中,借助requests库可轻松发送HTTP请求,如GET和POST。文章还展示了如何设置请求头、处理cookies和session。通过学习这些基础知识,读者将能够开始网络数据抓取,为进一步的数据分析奠定基础。后续文章将探讨HTML解析、动态内容处理及反爬虫策略。
|
3天前
|
数据采集 Web App开发 JavaScript
Python 网络爬虫技巧分享:优化 Selenium 滚动加载网易新闻策略
Python 网络爬虫技巧分享:优化 Selenium 滚动加载网易新闻策略
|
3天前
|
数据采集 存储 JSON
解析Perl爬虫代码:使用WWW::Mechanize::PhantomJS库爬取stackoverflow.com的详细步骤
在这篇文章中,我们将探讨如何使用Perl语言和WWW::Mechanize::PhantomJS库来爬取网站数据。我们的目标是爬取stackoverflow.com的内容,同时使用爬虫代理来和多线程技术以提高爬取效率,并将数据存储到本地。
|
3天前
|
数据采集 Web App开发 数据处理
Ruby网络爬虫教程:从入门到精通下载图片
Ruby网络爬虫教程:从入门到精通下载图片
|
3天前
|
数据采集 Web App开发 前端开发
Python爬虫之自动化测试Selenium#7
Selenium基本使用、查找结点、节点交互、动作链、获取节点信息、延时等待、前进后退、Cookies、选项卡管理、异常处理【2月更文挑战第26天】
47 1
Python爬虫之自动化测试Selenium#7
|
3天前
|
Web App开发 数据采集 前端开发
Python Selenium 爬虫淘宝案例
本文基于Selenium + MongoDB + ChromeDriver + Pyquery实现爬虫淘宝案例。【2月更文挑战第11天】
118 1
Python Selenium 爬虫淘宝案例

热门文章

最新文章