---恢复内容开始---

一. 先介绍图片懒加载技术

  当获取一个网站的图片数据时,只能爬取到图片的名称,并不能获得链接,而且也不能获得xpath表达式。这是应用了图片懒加载技术。

  - 图片懒加载技术的概念:

    -- 图片懒加载是一种网页优化技术。图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间。为了解决这种问题,通过前后端配合,使图片仅在浏览器当前视窗内出现时才加载该图片,达到减少首屏图片请求数的技术就被称为“图片懒加载”。

  - 如何实现懒加载数据技术:

    -- 在网页源码中,在img标签中首先会使用一个‘伪属性’(通常是src2,original等)去存放真正的图片链接,而不是直接存放在src属性中。当图片出现到页面可视化区域中,会将伪装属性替换成src属性,完成图片加载。

二. selenium

  selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、点击、下拉等等,拿到页面渲染之后的结果,并且selenium可以支持多种浏览器。

  - 环境的安装

    -- pip install selenium

    -- 下载浏览器驱动程序:

      http://chromedriver.storage.googleapis.com/index.html

    -- 查看驱动和浏览器版本的映射关系

      http://blog.csdn.net/huilan_same/article/details/51896672

  简单使用

 from selenium import webdriver
from time import sleep #后边是浏览器的驱动的位置,前面要加r‘’ ,是为了防止字符串转义
driver = webdriver。Chrome(r'驱动程序路径')
# 用get打开百度首页
driver.get("https://baidu.com")
# 查找页面的"设置"选项,并进行点击
driver.find_elements_by_link_text('设置')[0].click()
sleep(2)#模拟人的行为
# 打开设置后找到"搜索设置"选项,设置为每页显示50条
driver.find_elements_by_link_text('搜索设置')[0].click()
sleep(2) #选中每页显示50条
m = driver.find_element_by_id('id')
sleep(2)
m.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
m.find_element_by_xpath('.//option[3]').click()
sleep(2) # 点击保存设置
driver.find_elements_by_class_name("prefpanelgo")[0].click()
sleep(2) # 处理弹出的警告页面 accept()和取消dismiss()
driver.switch_to_alert().accept()
sleep(2) #找到百度的输入框,并输入美女
#driver.find_element_by_id('kw').send_keys('美女')
sleep(2)
#点击搜索按钮
driver.find_element_by_id('su').click()
sleep(2)
#在打开的页面中找到"Selenium - 开源社区",并打开这个页面
driver.find_element_by_link_text('美女_百度图片')[0].click()
sleep(3) #关闭浏览器
driver.quit()

  浏览器创建

  Selenium支持非常多的浏览器,如谷歌,火狐,Edge,还有Android,黑莓等手机端的浏览器 另外,也支持无界面浏览器PhantomJS.

 from selenium import webserver

 browser  =  webserver.Chrome()
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()

  元素定位

  webdriver提供了一系列的元素定位方法,常有的有如下:

 find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_xpath()
find_element_by_css_selector()

  注意:

    1.find_element_by_xxx找到的是第一个符合条件的标签,find_element_by_xxx找到的是符合条件的标签.

    2.根据ID,CSS选择器和XPATH获取,它们返回的结果完全一致.

    3.另外,selenium还提供通用方法find_element(),需要传入两个参数:查找方式By和值.实际上,它就是find_element_by_id()这种方法的通用函数版本,比如find_element_by_id(id)就等价于find_element(By.ID,id),这两种方式得到的结果一致.

  节点交互

  Selenium可以驱动浏览器来执行一些操作,也就是说可以让浏览器模拟执行一些动作.比较常见的用法有:输入文字时用send_keys()方法,清空文字时用clear()方法,点击按钮时用click()方法.

 from selenium import webdriver
import time browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
imput = browser.find_element_by_id('q')
input.send_keys('MAC')
time.sleep(1)
input.clear()
input.send_keys('Iphone')
button = browser.find_element_by_class_name('btn_search')
button.click()
time.sleep(3)
browser.quite()

  动作链

  上方示例中,一些交互动作都是针对某个节点执行的.如:输入框,我们就调用它的输入文字和清空文字的方法;对于按钮,就调用它的点击方法.有的操作,它们没有特定的执行对象,比如鼠标拖拽,键盘按键等,这些动作用另一种方式来执行就是动作链.

  比如,现在实现一个节点的拖拽操作,将某个节点从一处拖拽到另一个地方,代码如下:

 from selenium import webdriver
from selenium.webdriver import ActionChains
import time
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
# actions.drag_and_drop(source, target)
# actions.perform() #执行动作链
actions.click_and_hold(source)
time.sleep(3)
for i in range(5):
actions.move_by_offset(xoffset=17,yoffset=0).perform()
time.sleep(0.5) actions.release()

  执行JavaScript

  对于某些操作,SeleniumAPI并没有提供.比如: 下拉进度条,它可以直接模拟运行JavaScript,此时使用execute_script()方法即可实现,代码如下:

 from selenium import webdriver

 browser = webdriver.Chrome()
browser.get('https://www.jd.com')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
browser.execute_script('alert("123")')

  获取页面源码数据

  通过page_source属性可以获取网页的源代码,接着就可以使用解析库(如正则表达式、Beautiful Soup、pyquery等)来提取信息。

  前进和后退

  

 import time
form selenium import webdriver browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('http://www.sina.com.cn/') browser.back()
time.sleep(10)
browser.forward()
browser.close()

  Cookie处理

  使用Selenium,还可以方便的对Cookie进行操作,例如添加获取、添加、删除Cookie等。

 from selenium import webdriver

 browser = webserver.Chrome()
browser.get('http://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())

  异常处理

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

  

  phantomJS

  PhantomJS是一款无界面的浏览器,它自动化操作流程和上述操作谷歌浏览器是一致的.由于是无界面的,为了能够展示自动化操作流程,PhantomJS为用户提供了一个截屏功能,是用哪个save_screenshot函数实现.

 from selenium import webdriver
import time #phantomJS路径
path = r'PhantomJS驱动路径'
browser = webdriver.PhantomJS(path) #打开百度
url = 'http://www.baidu.com/'
browser.get(url) time.sleep(3) browser.save_screenshot(r'phantomjs\baidu.png') #查找input输入框
my_input = browser.find_element_by_id('kw')
#往筐里输入查询内容
my_input.send_keys('倪妮')
time.sleep(3)
#截屏
browser.save_screenshot(r'phantomjs\wife.png') #查找搜索按钮
button = browser.find_elements_by_class_name('s_btn')[0]
button.click() time.sleep(3) browser.save_screenshot(r'phantomjs\son.png') time.sleep(3) browser.quit()

  谷歌无头浏览器

  是一种无界面的谷歌浏览器

 from selenium import webdriver
from selenium.webdriver.Chrome.options import Options
import time #创建一个参数对象,用来控制Chrome以无界面模式打开
chrome_options = options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#驱动路径
path = r'C:\Users\ZBLi\Desktop\1801\day05\ziliao\chromedriver.exe' #创建浏览器对象
browser = webdriver.Chrome(executable_path,chrome_options = chrome_options) #上网
url = 'https://www.baidu.com/'
browser.get(url)
time.sleep(3) browser.save_screenshot('baidu.png') browser.quit()

二.示例

  爬取豆瓣网中的电影信息

 from selenium import webdriver
from time import sleep
import time if __name__ == '__main__':
url = 'https://movie.douban.com/typerank?type_name=%E6%81%90%E6%80%96&type=20&interval_id=100:90&action='
# 发起请求前,可以让url表示的页面动态加载出更多的数据
path = r'C:\Users\Administrator\Desktop\爬虫授课\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe'
# 创建无界面的浏览器对象
bro = webdriver.PhantomJS(path)
# 发起url请求
bro.get(url)
time.sleep(3)
# 截图
bro.save_screenshot('1.png') # 执行js代码(让滚动条向下偏移n个像素(作用:动态加载了更多的电影信息))
js = 'window.scrollTo(0,document.body.scrollHeight)'
bro.execute_script(js) # 该函数可以执行一组字符串形式的js代码
time.sleep(2) bro.execute_script(js) # 该函数可以执行一组字符串形式的js代码
time.sleep(2)
bro.save_screenshot('2.png')
time.sleep(2)
# 使用爬虫程序爬去当前url中的内容
html_source = bro.page_source # 该属性可以获取当前浏览器的当前页的源码(html)
with open('./source.html', 'w', encoding='utf-8') as fp:
fp.write(html_source)
bro.quit()

三.selenium规避被检测识别

  正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为

undefined。而使用selenium访问则该值为true。那么如何解决这个问题呢?

只需要设置Chromedriver的启动参数即可解决问题。在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches,它的值为['enable-automation'],完整代码如下

 from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)

    

08 Python爬虫之selenium的更多相关文章

  1. [Python爬虫]使用Selenium操作浏览器订购火车票

    这个专题主要说的是Python在爬虫方面的应用,包括爬取和处理部分 [Python爬虫]使用Python爬取动态网页-腾讯动漫(Selenium) [Python爬虫]使用Python爬取静态网页-斗 ...

  2. Python 爬虫利器 Selenium 介绍

    Python 爬虫利器 Selenium 介绍 转 https://mp.weixin.qq.com/s/YJGjZkUejEos_yJ1ukp5kw 前面几节,我们学习了用 requests 构造页 ...

  3. Python爬虫之selenium的使用(八)

    Python爬虫之selenium的使用 一.简介 二.安装 三.使用 一.简介 Selenium 是自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏 ...

  4. Python爬虫之selenium高级功能

    Python爬虫之selenium高级功能 原文地址 表单操作 元素拖拽 页面切换 弹窗处理 表单操作 表单里面会有文本框.密码框.下拉框.登陆框等. 这些涉及与页面的交互,比如输入.删除.点击等. ...

  5. Python爬虫之selenium库使用详解

    Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...

  6. python爬虫利器Selenium使用详解

    简介: 用pyhon爬取动态页面时普通的urllib2无法实现,例如下面的京东首页,随着滚动条的下拉会加载新的内容,而urllib2就无法抓取这些内容,此时就需要今天的主角selenium. Sele ...

  7. Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息

    目标 之前的自动答复机器人需要从一个内部网页上获取的消息用于回复一些问题,但是没有对应的查询api,于是想到了用脚本模拟浏览器访问网站爬取内容返回给用户.详细介绍了第一次探索python爬虫的坑. 准 ...

  8. python爬虫——用selenium爬取京东商品信息

    1.先附上效果图(我偷懒只爬了4页)  2.京东的网址https://www.jd.com/ 3.我这里是不加载图片,加快爬取速度,也可以用Headless无弹窗模式 options = webdri ...

  9. python爬虫之Selenium

    Selenium的使用 #!/usr/bin/env python # -*- coding:utf-8 -*- """ Selenium是一个第三方模块,可以完全模拟用 ...

随机推荐

  1. PHP 分页+查询

    首先是主页面,与上篇分页页面相同 <table width="100%" border="1" cellpadding="0" cel ...

  2. struts数据回显

    数据回显,必须要用struts标签! Action中: // 进入修改页面 public String viewUpdate() { // 模拟一个对象(先获取一个id,再根据id调用service查 ...

  3. 在本地局域网 windows server 2008 下安装 Nginx 1.12.1

    简介: Nginx ("engine x") 是高性能 HTTP.反向代理服务器,也是 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗 ...

  4. delphi raise 语句: 抛出异常

    //例1:begin  raise Exception.Create('抛出异常');end;//例2:begin  raise Exception.CreateFmt('%s %d', ['错误代码 ...

  5. logging.basicConfig函数各参数:

    import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(line ...

  6. MSSQL字符串取相应的第几个数组值

    create function Get_StrArrayStrOfIndex( @str varchar(5000), --要分割的字符串 @split varchar(10), --分隔符号 @in ...

  7. markdown-博客编辑

    1. 快捷键 2. 基本语法 2.1 字体设置斜体.粗体.删除线 2.2 分级标题 2.3 链接 2.4 分割线 2.5 代码块 2.6 引用 2.7 列表 2.8 表格 3. 常用技巧 3.1 换行 ...

  8. 【HANA系列】SAP HANA SQL合并多行操作

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL合并多行 ...

  9. UOJ#548.数学

    #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #inc ...

  10. Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits)

    Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits) 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数 ...