澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站爬虫与反爬虫的战争,如何

2019-05-04 作者:www.8455.com   |   浏览(83)

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider) 之间恢宏壮阔的斗争...

 

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),那时期的努力恢宏壮阔...

Selenium

Selenium是1个Web的自动化测试工具,最初是为网站自动化测试而付出的,类型像我们玩游戏用的按钮Smart,能够按钦命的命令自动操作,不相同的是Selenium能够直接运转在浏览器上,它支持具有主流的浏览器(包含PhantomJS那几个无分界面包车型客车浏览器)。

Selenium能够依照我们的命令,让浏览器自动加载页面,获取要求的数码,乃至页面截屏,或然判定网站上一点动作是或不是产生。

Selenium自身不带浏览器,不协助浏览器的法力,它须要与第二方浏览器结合在同步才能采取。不过我们超过一半时候必要让它内嵌在代码中运营,所以大家得以用二个叫PhantomJS的工具取代真实的浏览器。

能够从 PyPI 网址下载 Selenium库https://pypi.python.org/simple/selenium ,也能够用 第2方管理器 pip用命令安装:pip install selenium

Selenium 官方参考文书档案:

1,Selenium

Selenium是多少个Web的自动化测试工具,最初是为网站自动化测试而开垦的,类型像我们玩游戏用的按钮Smart,能够按钦命的一声令下自动操作,不相同是Selenium 能够一贯运营在浏览器上,它帮忙具备主流的浏览器(包含PhantomJS这几个无分界面包车型大巴浏览器)。

Selenium 能够依靠大家的一声令下,让浏览器自动加载页面,获取须要的数量,乃至页面截屏,可能判别网站上或多或少动作是还是不是发生。

Selenium 自个儿不带浏览器,不协理浏览器的机能,它供给与第3方浏览器结合在共同本领应用。不过大家有时须要让它内嵌在代码中运作,所以我们能够用叁个叫 PhantomJS 的工具代替真实的浏览器。

安装:sudo pip install selenium
Selenium 官方参考文书档案:http://selenium-python.readthedocs.io/index.html

  • 小莫想要某站上全部的影片,写了规范的爬虫(基于HttpClient库),不断地遍历某站的影视列表页面,根据Html 分析电影名字存进自个儿的数据库。

  • 本条站点的运转小黎开采某些时间段请求量陡增,分析日志发掘都以IP(xxx.xxx.xxx.xxx)这一个用户,并且 user-agent 照旧Python-urllib/2.柒 ,基于那两点剖断非人类后直接在服务器上封闭扼杀。

  • 小莫电影只爬了概略上,于是也本着的转移了下计策:一. user-agent 模仿百度("Baiduspider..."),2. IP每爬半个钟头就换一个IP代理。

  • 小黎也意识了对应的变迁,于是在服务器上安装了一个频率限制,每分钟当先123次呼吁的再屏蔽IP。 同时思考到百度家的爬虫有极大希望会被误伤,想想市集部门每月几八万的排放,于是写了个剧本,通过 hostname 检查下这么些 ip 是或不是真的百度家的,对那些 ip 设置一个白名单。

  • 小莫开采了新的范围后,想着小编也不急着要那么些数量,留给服务器稳步爬吧,于是修改了代码,随机一-3秒爬贰回,爬十二次止息10秒,每一天只在8-1二,1捌-20点爬,隔几天还休憩一下。

  • 小黎瞧着新的日志头都大了,再设定规则非常大心会损伤真实用户,于是希图换了三个思路,当1个小时的总请求超过五十回的时候弹出2个验证码弹框,未有准确输入的话就把 IP 记录进黑名单。

  • 小莫看到验证码某些傻脸了,不过也不是绝非艺术,先去学学了图像识别(关键词 PIL,tesseract),再对验证码实行了2值化,分词,情势练习之后,可想而知最终识别了小黎的验证码(关于验证码,验证码的鉴定区别,验证码的反识别也是三个扩充壮丽的冲教头...),之后爬虫又跑了起来。

  • 小黎是个坚强的好同学,看到验证码被攻下后,和费用同学探讨了转移下开垦格局,数据并不再直接渲染,而是由前端同学异步获取,并且经过 JavaScript 的加密库生成动态的 token,同时加密库再张开模糊。

  • 模糊过的加密库就从未有过办法了么?当然不是,能够稳步调节和测试,找到加密原理,可是小也许筹算用那样耗费时间耗力的方法,他废弃了依赖HttpClient的爬虫,选用了内置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎运转页面,直接获得了精确的结果,又二遍得到了对方的数目。

  • 小黎:.....

Selenium

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),这里面包车型地铁斗争恢宏壮阔...

Day 1
小莫想要某站上全体的电影,写了规范的爬虫(基于HttpClient库),不断地遍历某站的影片列表页面,依据Html 分析电影名字存进自个儿的数据库。
以此站点的运营小黎意识有个别时刻段请求量陡增,分析日志发掘都以IP(一.壹.1.壹)那一个用户,并且 useragent 依旧 JavaClient1.6,基于那两点推断非人类后向来在Nginx 服务器上封闭扼杀。

PhantomJS

PhantomJS是贰个依照Webkit的“无分界面”(headless)浏览器,它会把网址加载到内部存款和储蓄器并举办页面上的JavaScript,因为不会显得图形分界面,所以运营起来比全体的浏览器要快快。

1旦大家把Selenium和PhantomJS结合在一齐,就足以运作二个不行强劲的互连网爬虫了,那些爬虫能够拍卖JavaScript、Cookie、headers,以及另外大家真实用户供给做的作业。

注意:PhantomJS 只好从它的官方网站 下载。 因为 PhantomJS 是一个功能完善(尽管无分界面)的浏览器而非贰个 Python 库,所以它无需像 Python 的别的库一样安装,但大家得以因而Selenium调用PhantomJS来直接接纳。

PhantomJS 官方参考文书档案:http://phantomjs.org/documentation

2,PhantomJS

PhantomJS 是一个依据Webkit的“无分界面”(headless)浏览器,它会把网址加载到内部存款和储蓄器并实行页面上的 JavaScript,因为不会突显图形分界面,所以运维起来比总体的浏览器要高速。

假定大家把 Selenium 和 PhantomJS 结合在共同,就足以运作二个那三个有力的网络爬虫了,那些爬虫能够拍卖 JavaScrip、Cookie、headers,以及其它大家真正用户要求做的专门的学业。

PhantomJS 是三个功效完善(即使无界面)的浏览器而非二个 Python 库,所以它不需求像 Python 的其它库同样安装,但大家能够通过Selenium调用PhantomJS来一向运用。

安装:sudo apt-get install phantomjs

PhantomJS 官方参考文书档案:http://phantomjs.org/documentation

 Selenium是四个Web的自动化测试工具,最初是为网址自动化测试而支付的,类型像我们玩游戏用的开关Smart,能够按钦赐的通令自动操作,不一致是Selenium 能够一向运转在浏览器上,它帮忙具备主流的浏览器(包蕴PhantomJS那一个无分界面包车型地铁浏览器)。

Day 1

小莫想要某站上全数的影片,写了专门的职业的爬虫(基于HttpClient库),不断地遍历某站的录制列表页面,依照Html 分析电影名字存进自个儿的数据库。
这一个站点的运行小黎开掘有些时间段请求量陡增,分析日志发现都是IP(1.壹.1.壹)那些用户,并且 useragent 还是 JavaClient一.陆,基于那两点决断非人类后一向在Nginx 服务器上封闭扼杀。

Day 2
小莫电影只爬了四分之2,于是也针对的改换了下攻略:一. useragent 效仿百度("Baiduspider..."),贰. IP每爬半个小时就换二个IP代理。
小黎也发觉了相应的变迁,于是在 Nginx 上设置了2个功用限制,每分钟超过125回呼吁的再屏蔽IP。 同时思量到百度家的爬虫有希望会被误伤,想想市集机构每月几拾万的投放,于是写了个剧本,通过 hostname 检查下那一个 ip 是或不是真的百度家的,对这么些 ip 设置三个白名单。

快速入门

Selenium库里有个叫WebDriver的API。WebDriver有点儿像能够加载网址的浏览器,不过它能够像BeautifulSoup大概此外Selector对象一样用来找寻页面成分,与页面上的要素进行交互(发送文书、点击等),以及实施其它动作来运维网络爬虫。

#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'mayi'

# 导入webdriver
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# 调用环境变量指定的PhantomJS浏览器创建浏览器对象,executable_path:指定PhantomJS位置
driver = webdriver.PhantomJS(executable_path = r"D:Program Filesphantomjsbinphantomjs")

# get()方法会一直等到页面被完全加载,然后才会继续程序
driver.get("http://www.baidu.com/")

# 获取页面名为wrapper的id标签的文本内容
data = driver.find_element_by_id("wrapper").text

# 打印获取的文本内容
print(data)

# 打印页面标题:百度一下,你就知道
print(driver.title)

# 生成当前页面快照并保存
driver.save_screenshot("baidu.jpg")

# 在百度搜索输入框中输入“蚂蚁”
driver.find_element_by_id("kw").send_keys("蚂蚁")

# 模拟点击“百度一下”按钮
driver.find_element_by_id("su").click()
# 等待2秒,让页面加载
time.sleep(2)

# 获取搜索后的页面快照
driver.save_screenshot("蚂蚁.jpg")

# 打印网页渲染后的源代码
# print(driver.page_source)

# 获取当前页面Cookie
print(driver.get_cookies())

# Ctrl   a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "a")

# Ctrl   x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "x")

# 输入框重新输入内容
driver.find_element_by_id("kw").send_keys("python")

# 模拟Enter回车键
driver.find_element_by_id("su").send_keys(Keys.ENTER)

# 等待2秒,让页面加载
time.sleep(2)

# 清除输入框内容
driver.find_element_by_id("kw").clear()

# 获取新的快照
driver.save_screenshot("python.jpg")

# 获取当前url
print(driver.current_url)

# 关闭当前页面,如果只有一个页面,会关闭浏览器
driver.close()

# 关闭浏览器
driver.quit()

三,轻松操作

Selenium Curry有个叫 WebDriver 的 API。WebDriver 有点儿像可以加载网址的浏览器,可是它也足以像 BeautifulSoup 或然此外Selector 对象一样用来搜寻页面成分,与页面上的要素举办交互 (发送文书、点击等),以及施行别的动作来运营互联网爬虫。

# IPython2 测试代码

# 导入 webdriver
from selenium import webdriver

# 调用环境变量指定的PhantomJS浏览器创建浏览器对象
driver = webdriver.PhantomJS()

# 如果没有在环境变量指定PhantomJS位置
# driver = webdriver.PhantomJS(executable_path="./phantomjs"))

# get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
driver.get("http://www.baidu.com/")

# 获取页面名为 wrapper的id标签的文本内容
data = driver.find_element_by_id("wrapper").text

# 打印数据内容
print data

# 打印页面标题 "百度一下,你就知道"
print driver.title

# 生成当前页面快照并保存
driver.save_screenshot("baidu.png")

# id="kw"是百度搜索输入框,输入字符串"长城"
driver.find_element_by_id("kw").send_keys(u"长城")

# id="su"是百度搜索按钮,click() 是模拟点击
driver.find_element_by_id("su").click()

# 获取新的页面快照
driver.save_screenshot("长城.png")

# 打印网页渲染后的源代码
print driver.page_source

# 获取当前页面Cookie
print driver.get_cookies()

# 调用键盘按键操作时需要引入的Keys包
from selenium.webdriver.common.keys import Keys

# ctrl a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')

# ctrl x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')

# 输入框重新输入内容
driver.find_element_by_id("kw").send_keys("itcast")

# 模拟Enter回车键
driver.find_element_by_id("su").send_keys(Keys.RETURN)

# 清除输入框内容
driver.find_element_by_id("kw").clear()

# 生成新的页面快照
driver.save_screenshot("itcast.png")

# 获取当前url
print driver.current_url

# 关闭当前页面,如果只有一个页面,会关闭浏览器
# driver.close()

# 关闭浏览器
driver.quit()

Selenium 能够依照大家的授命,让浏览器自动加载页面,获取须求的多寡,以致页面截屏,只怕判别网址上一些动作是还是不是发生。

Day 2

小莫电影只爬了50%,于是也本着的转变了下计策:1. useragent 模拟百度("Baiduspider..."),2. IP每爬半个时辰就换八个IP代理。
小黎也发觉了对应的浮动,于是在 Nginx 上设置了1个频率限制,每分钟当先122回呼吁的再屏蔽IP。 同时驰念到百度家的爬虫有不小概率会被误伤,想想市集机构每月几100000的排泄,于是写了个本子,通过 hostname 检查下那一个 ip 是还是不是真的百度家的,对那么些 ip 设置3个白名单。

Day 3
小莫开掘了新的限量后,想着笔者也不急着要这么些多少,留给服务器渐渐爬吧,于是修改了代码,随机1-3秒爬2回,爬1一回休憩拾秒,每日只在8-1②,1八-20点爬,隔几天还休憩一下。
小黎望着新的日志头都大了,再设定规则十分的大心会挫伤真实用户,于是打算换了一个思路,当一个小时的总请求超越50遍的时候弹出贰个验证码弹框,未有可信科学输入的话就把 IP 记录进黑名单。

页面操作

Selenium的WebDriver提供了各样办法来找寻成分,如若下边有二个表单输入框:

<input type="text" name="user-name" id="passwd-id" />

那么

# 获取id标签值
element = driver.find_element_by_id("passwd-id")

# 获取name标签值
element = driver.find_element_by_name("user-name")

# 获取标签名值
element = driver.find_element_by_tag_name("input")

# 通过xpath来匹配
element = driver.find_element_by_xpath("//input[@id='passwd-id']")

四,页面操作

Selenium 的 WebDriver提供了种种法子来搜索成分,假诺上面有贰个表单输入框:

<input type="text" name="user-name" id="passwd-id" />

那么:

# 获取id标签值
element = driver.find_element_by_id("passwd-id")
# 获取name标签值
element = driver.find_element_by_name("user-name")
# 获取标签名值
element = driver.find_elements_by_tag_name("input")
# 也可以通过XPath来匹配
element = driver.find_element_by_xpath("//input[@id='passwd-id']")

Selenium 自个儿不带浏览器,不扶助浏览器的成效,它须求与第3方浏览器结合在协同手艺使用.

Day 3

小莫开掘了新的限量后,想着笔者也不急着要这个多少,留给服务器慢慢爬吧,于是修改了代码,随机一-3秒爬三回,爬拾5次平息十秒,每日只在捌-1二,1八-20点爬,隔几天还休憩一下。
小黎看着新的日志头都大了,再设定规则比比较大心会挫伤真实用户,于是希图换了二个思路,当二个钟头的总请求超越4105回的时候弹出1个验证码弹框,没有可信科学输入的话就把 IP 记录进黑名单。

Day 4
小莫看到验证码某些傻脸了,可是也不是从没有过办法,先去读书了图像识别(关键词 PIL,tesseract),再对验证码实行了二值化,分词,方式陶冶未来,识别了小黎的验证码(关于验证码,验证码的辨认,验证码的反识别也是一个扩中和丽的斗争史,这里先不打开....),之后爬虫又跑了肆起。
小黎是个坚强的好同学,看到验证码被攻占后,和开辟同学钻探了调换下开辟方式,数据并不再直接渲染,而是由前端同学异步获取,并且经过 js 的加密库生成动态的 token,同时加密库再举行模糊(比较重大的步骤的确有网址那样做,参见和讯的登入流程)。

定位UI元素(webElements)

有关成分的选料:

find_element_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

5,定位UI元素 (WebElements)

有关成分的精选,有如下的API 单个成分选择

find_element_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

下载selenium webdriver ‘geckodriver.exe’,下载好后放到python目录里面

Day 4

小莫看到验证码某个傻脸了,不过也不是从未有过办法,先去读书了图像识别(关键词 PIL,tesseract),再对验证码进行了二值化,分词,方式演练未来,识别了小黎的验证码(关于验证码,验证码的识别,验证码的反识别也是贰个扩展壮丽的斗争史,这里先不张开....),之后爬虫又跑了4起。
小黎是个坚强的好同学,看到验证码被攻占后,和支付同学切磋了扭转下开荒方式,数据并不再间接渲染,而是由前端同学异步获取,并且经过 js 的加密库生成动态的 token,同时加密库再进行模糊(比较关键的步骤的确有网址那样做,参见天涯论坛的登入流程)。

Day5
混淆过的加密库就从未有过办法了么?当然不是,能够逐步调节和测试,找到加密原理,可是小也许策画用这样耗费时间耗力的办法,他丢弃了依附HttpClient的爬虫,选取了内置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎中js 加密脚本算出了不错的结果,又一回获得了对方的数码。
小黎:.....

1.by id

# 页面内容
<div id="coolestWidgetEvah">...</div>

# 实现
element = driver.find_element_by_id(coolestWidgetEvah")

陆,鼠标动作链

稍许时候,大家须要再页面上模仿一些鼠标操作,举例双击、右击、拖拽乃至按住不动等,大家得以因此导入 ActionChains 类来成功:

澳门新萄京官方网站,示例:

#导入 ActionChains 类
from selenium.webdriver import ActionChains

# 鼠标移动到 ac 位置
ac = driver.find_element_by_xpath('element')
ActionChains(driver).move_to_element(ac).perform()


# 在 ac 位置单击
ac = driver.find_element_by_xpath("elementA")
ActionChains(driver).move_to_element(ac).click(ac).perform()

# 在 ac 位置双击
ac = driver.find_element_by_xpath("elementB")
ActionChains(driver).move_to_element(ac).double_click(ac).perform()

# 在 ac 位置右击
ac = driver.find_element_by_xpath("elementC")
ActionChains(driver).move_to_element(ac).context_click(ac).perform()

# 在 ac 位置左键单击hold住
ac = driver.find_element_by_xpath('elementF')
ActionChains(driver).move_to_element(ac).click_and_hold(ac).perform()

# 将 ac1 拖拽到 ac2 位置
ac1 = driver.find_element_by_xpath('elementD')
ac2 = driver.find_element_by_xpath('elementE')
ActionChains(driver).drag_and_drop(ac1, ac2).perform()

firefox的目录也要增加随情况变量中

Day 5

混淆过的加密库就从未有过办法了么?当然不是,能够逐步调节和测试,找到加密原理,可是小莫不希图用那样耗费时间耗力的主意,他舍弃了依据HttpClient的爬虫,选择了放置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎中js 加密脚本算出了不利的结果,又贰遍得到了对方的多少。
小黎:.....

爬虫与发爬虫的拼搏还在一连。
可是实在使用时候,一般我们做到依据 IP 限制频次就终止了,除非很宗旨的数量,不会再实行越来越多的表明,究竟工程的主题材料十分之五是基金的主题素材。

关于高效部分,一些 Tips:
1.尽量调整和收缩请求次数,能抓列表页就不抓详细情况页
二.永不只看 Web 网址,还有 App 和 H5,他们的反爬虫措施一般相比少
三.如若真的对质量须要非常高,能够考虑八线程(一些成熟的框架如 scrapy都已协助),乃至分布式

 

作者:申玉宝
链接:

 

爬虫与发爬虫的披荆斩棘还在持续。
可是事实上应用时候,一般大家做到依据 IP 限制频次就终止了,除非很宗旨的多少,不会再开始展览愈多的求证,究竟工程的标题六分之三是基金的难题。

2.by name

# 页面内容
<input name="cheese" type="text"/>

# 实现
element = driver.find_element_by_name("cheese")

7,填充表单

咱俩早就精通了怎样向文本框中输入文字,不过有时我们会境遇<select> </select>标签的下拉框。直接点击下拉框中的选项不分明可行。

<select id="status" class="form-control valid" onchange="" name="status">
    <option value=""></option>
    <option value="0">未审核</option>
    <option value="1">初审通过</option>
    <option value="2">复审通过</option>
    <option value="3">审核不通过</option>
</select>

Selenium专门提供了Select类来管理下拉框。 其实 WebDriver 中提供了二个叫 Select 的点子,能够援助我们成功那么些业务:

# 导入 Select 类
from selenium.webdriver.support.ui import Select

# 找到 name 的选项卡
select = Select(driver.find_element_by_name('status'))


select.select_by_index(1)
select.select_by_value("0")
select.select_by_visible_text(u"未审核")

如上是三种选取下拉框的艺术,它能够根据目录来抉择,可以依据值来抉择,能够依靠文字来摘取。注意:

  • index 索引从 0 开始
  • value是option标签的二个属性值,并不是体以往下拉框中的值
  • visible_text是在option标签文本的值,是体以后下拉框的值

全总收回选用怎么做呢?非常粗略:

select.deselect_all()

Selenium Curry有个叫 WebDriver 的 API。WebDriver 有点儿像可以加载网址的浏览器,可是它也得以像 BeautifulSoup 或许别的 Selector 对象一样用来寻觅页面成分,与页面上的因素进行相互(发送文书、点击等),以及施行别的动作来运作互联网爬虫。

至于高效部分,一些 Tips:
一.尽量压缩请求次数,能抓列表页就不抓实际情况页
二.永不只看 Web 网站,还有 App 和 H5,他们的反爬虫措施一般比较少
叁.假诺真的对质量供给非常高,能够考虑十贰线程(一些老奸巨滑的框架如 scrapy都已补助),以致布满式

3.by xpath

# 页面内容
<input type="text" name="example" />
<input type="text" name="other" />

# 实现
element = driver.find_elements_by_xpath("//input")

8,弹窗管理

当您触发了某些事件随后,页面出现了弹窗提醒,管理那几个提示可能获得提醒新闻方法如下:

alert = driver.switch_to_alert()

selenium火速入门

4.by link text

# 页面内容
<a href="http://www.google.com/search?q=cheese">cheese</a>

# 实现
element = driver.find_element_by_link_text("cheese")

玖,页面切换

1个浏览器断定会有许多窗口,所以我们必定要有主意来贯彻窗口的切换。切换窗口的主意如下:

driver.switch_to.window("this is window name")

也得以动用 window_handles 方法来得到每种窗口的操作对象。举个例子:

for handle in driver.window_handles:
    driver.switch_to_window(handle)
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from selenium import webdriver

# 要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys import Keys

#创建浏览器对象
driver = webdriver.Firefox()

driver.get("http://www.baidu.com")

#打印页面标题“百度一下你就知道”
print driver.title

#生成当前页面快照
driver.save_screenshot("baidu.png")

# id="kw"是百度搜索框,输入字符串“微博”,跳转到搜索中国页面
driver.find_element_by_id("kw").send_keys(u"微博")

# id="su"是百度搜索按钮,click() 是模拟点击
driver.find_element_by_id("su").click()

# 获取新的页面快照
driver.save_screenshot(u"微博.png")

# 打印网页渲染后的源代码
print driver.page_source

# 获取当前页面Cookie
print driver.get_cookies()

# ctrl a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')

# ctrl x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')

# 输入框重新输入内容
driver.find_element_by_id("kw").send_keys("test")

# 模拟Enter回车键
driver.find_element_by_id("su").send_keys(Keys.RETURN)

# 清除输入框内容
driver.find_element_by_id("kw").clear()

# 生成新的页面快照
driver.save_screenshot("test.png")

# 获取当前url
print driver.current_url

# 关闭当前页面,如果只有一个页面,会关闭浏览器
# driver.close()

# 关闭浏览器
driver.quit()

5.by partial link text

# 页面内容
<a href="http://www.google.com/search?q=cheese">search for cheese</a>>

# 实现
element = driver.find_element_by_partial_link_text("cheese")

拾,页前边进和落后

操作页面的开辟进取和倒退作用:

driver.forward()     #前进
driver.back()        # 后退

一.页面操作

6.by tag name

# 页面内容
<iframe src="..."></iframe>

# 实现
element = driver.find_element_by_tag_name("iframe")

11,Cookies

获得页面各类库克ies值,用法如下

for cookie in driver.get_cookies():
    print "%s=%s;" % (cookie['name'], cookie['value'])

去除Cookies,用法如下

# By name
driver.delete_cookie("BAIDUID")

# all
driver.delete_all_cookies()

假定有上面包车型大巴输入框

7.by class name

# 页面内容
<div id="food">milkcheese</div>

# 实现
element = driver.find_elements_by_class_name("div")

12,页面等待

于今的网页愈多使用了 Ajax 本事,那样程序便不可能鲜明何时有个别成分完全加载出来了。假诺实在页面等待时间过长导致有个别dom成分还没出去,不过你的代码直接行使了那么些WebElement,那么就能够抛出NullPointer的不行。

为了幸免那种成分定位困难而且会增加发生 ElementNotVisibleException 的概率。所以 Selenium 提供了二种等待方式,壹种是隐式等待,1种是显式等待。

隐式等待是等待特定的岁月,显式等待是点名某一口径直到那个条件建构即继续推行。

<input type="text" name="user-name" id="passwd-id" />

8.by css selector

# 页面内容
<div id="food">milkcheese</div>

# 实现
element = driver.find_elements_by_css_selector("#food span.dairy.aged")

显式等待

显式等待钦命有个别条件,然后设置最长等待时间。就算在那一个时刻还未曾找到成分,那么便会抛出尤其了。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverWait 库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions 类,负责条件出发
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.PhantomJS()
driver.get("http://www.xxxxx.com/loading")
try:
    # 每隔10秒查找页面元素 id="myDynamicElement",直到出现则返回
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

假诺不写参数,程序默许会 0.5s 调用二遍来查阅元素是不是业已成形,尽管本来元素正是存在的,那么会立刻重临。

上边是局地放到的等候条件,你可以间接调用这一个标准,而不用本人写一些等待条件了。

title_is
title_contains
presence_of_element_located
visibility_of_element_located
visibility_of
presence_of_all_elements_located
text_to_be_present_in_element
text_to_be_present_in_element_value
frame_to_be_available_and_switch_to_it
invisibility_of_element_located
element_to_be_clickable – it is Displayed and Enabled.
staleness_of
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
alert_is_present

招来办法

鼠标动作链

些微时候,我们供给在页面上模仿一些鼠标操作,比方双击、右击、拖拽乃至按住不动等,我们能够透过导入ActionChains类来做到:

#导入 ActionChains 类
from selenium.webdriver import ActionChains

# 鼠标移动到 ac 位置
ac = driver.find_element_by_xpath('element')
ActionChains(driver).move_to_element(ac).perform()


# 在 ac 位置单击
ac = driver.find_element_by_xpath("elementA")
ActionChains(driver).move_to_element(ac).click(ac).perform()

# 在 ac 位置双击
ac = driver.find_element_by_xpath("elementB")
ActionChains(driver).move_to_element(ac).double_click(ac).perform()

# 在 ac 位置右击
ac = driver.find_element_by_xpath("elementC")
ActionChains(driver).move_to_element(ac).context_click(ac).perform()

# 在 ac 位置左键单击hold住
ac = driver.find_element_by_xpath('elementF')
ActionChains(driver).move_to_element(ac).click_and_hold(ac).perform()

# 将 ac1 拖拽到 ac2 位置
ac1 = driver.find_element_by_xpath('elementD')
ac2 = driver.find_element_by_xpath('elementE')
ActionChains(driver).drag_and_drop(ac1, ac2).perform()

隐式等待

隐式等待相比简单,正是轻便地设置3个等待时间,单位为秒。

from selenium import webdriver

driver = webdriver.PhantomJS()
driver.implicitly_wait(10) # seconds
driver.get("http://www.xxxxx.com/loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")

自然假如不安装,暗中同意等待时间为0。

# 获取id标签值
element = driver.find_element_by_id("passwd-id")
# 获取name标签值
element = driver.find_element_by_name("user-name")
# 获取标签名值
element = driver.find_elements_by_tag_name("input")
# 也可以通过XPath来匹配
element = driver.find_element_by_xpath("//input[@id='passwd-id']")

填充表单

小编们早已清楚了怎么样向文本框中输入文字,但是有时大家会遇上select 标签的下拉框。直接点击下拉框中的选项不明确可行。

<select id="status" class="form-control valid" onchange="" name="status">
    <option value=""></option>
    <option value="0">未审核</option>
    <option value="1">初审通过</option>
    <option value="2">复审通过</option>
    <option value="3">审核不通过</option>
</select>

  澳门新萄京官方网站 1

Selenium专门提供了select类来管理下拉框。其实WebDriver中提供了二个叫Select的办法,能够扶持我们成功那几个事情:

# 导入 Select 类
from selenium.webdriver.support.ui import Select

# 找到 name 的选项卡
select = Select(driver.find_element_by_name('status'))

# 
select.select_by_index(1)
select.select_by_value("0")
select.select_by_visible_text("未审核")

上述是二种接纳下拉框的章程,可以凭仗目录来摘取、依据值来摘取、遵照文字内容来挑选。注意:

  • index 索引从0开始
  • value 是option标签的二个属性值,并不是显得在下拉框中的值
  • visible_text 是option标签文本的值,是显得在下拉框的值

整整撤除采用:select.deselect_all()

1三,模拟网址登六

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.PhantomJS()
driver.get("http://www.douban.com")

# 输入账号密码
driver.find_element_by_name("form_email").send_keys("xxxxx@xxxx.com")
driver.find_element_by_name("form_password").send_keys("xxxxxxxx")

# 模拟点击登录
driver.find_element_by_xpath("//input[@class='bn-submit']").click()

# 等待3秒
time.sleep(3)

# 生成登陆后快照
driver.save_screenshot("douban.png")

# 保存源码
with open("douban.html", "w") as file:
    file.write(driver.page_source)

driver.quit()

二.牢固成分的不贰秘技

弹窗管理

当你触发了有个别事件之后,页面出现了弹窗提醒,管理这一个提醒只怕取得提醒新闻方法:

alert = driver.switch_to_alert()

1四,动态页面模拟点击

# python的测试模块
import unittest
from selenium import webdriver
from bs4 import BeautifulSoup


class douyuSelenium(unittest.TestCase):
    # 初始化方法
    def setUp(self):
        self.driver = webdriver.PhantomJS()

    #具体的测试用例方法,一定要以test开头
    def testDouyu(self):
        self.driver.get('http://www.douyu.com/directory/all')
        while True:
            # 指定xml解析
            soup = BeautifulSoup(driver.page_source, 'xml')
            # 返回当前页面所有房间标题列表 和 观众人数列表
            titles = soup.find_all('h3', {'class': 'ellipsis'})
            nums = soup.find_all('span', {'class': 'dy-num fr'})

            # 使用zip()函数来可以把列表合并,并创建一个元组对的列表[(1,2), (3,4)]
            for title, num in zip(nums, titles):
                print u"观众人数:"   num.get_text().strip(), u"t房间标题: "   title.get_text().strip()
            # 指定元素找到则返回 非-1,表示到达最后一页,退出循环
            if driver.page_source.find('shark-pager-disable-next') != -1:
                break
            # 模拟下一页点击
            self.driver.find_element_by_class_name('shark-pager-next').click()

    # 退出时的清理方法
    def tearDown(self):
        print '加载完成...'
        self.driver.quit()

if __name__ == "__main__":
    unittest.main()
find_element_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

页面切换

二个浏览器料定会有无数窗口,所以我们必定要有主意来兑现窗口的切换。切换窗口的办法如下:

driver.switch_to.window("this is window name")

也能够行使window_handles 方法来获得各样窗口的操作对象。

for handle in driver.window_handles:
    driver.switch_to_window(handle)

15,执行javaScript语句

  • 隐藏百度图片
from selenium import webdriver

driver = webdriver.PhantomJS()
driver.get("https://www.baidu.com/")

# 给搜索输入框标红的javascript脚本
js = "var q=document.getElementById("kw");q.style.border="2px solid red";"

# 调用给搜索输入框标红js脚本
driver.execute_script(js)

#查看页面快照
driver.save_screenshot("redbaidu.png")

#js隐藏元素,将获取的图片元素隐藏
img = driver.find_element_by_xpath("//*[@id='lg']/img")
driver.execute_script('$(arguments[0]).fadeOut()',img)

# 向下滚动到页面底部
driver.execute_script("$('.scroll_top').click(function(){$('html,body').animate({scrollTop: '0px'}, 800);});")

#查看页面快照
driver.save_screenshot("nullbaidu.png")

driver.quit()
  • 仿照滚动条滚动到底层
from selenium import webdriver
import time

driver = webdriver.PhantomJS()
driver.get("https://movie.douban.com/typerank?type_name=剧情&type=11&interval_id=100:90&action=")

# 向下滚动10000像素
js = "document.body.scrollTop=10000"
#js="var q=document.documentElement.scrollTop=10000"
time.sleep(3)

#查看页面快照
driver.save_screenshot("douban.png")

# 执行JS语句
driver.execute_script(js)
time.sleep(10)

#查看页面快照
driver.save_screenshot("newdouban.png")

driver.quit()

三.鼠标动作

页前面进和滞后

操作页面包车型地铁前进和落后作用:

driver.forward()     #前进
driver.back()        # 后退
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from selenium import webdriver

# 要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains

#创建浏览器对象
driver = webdriver.Firefox()

driver.get("http://www.baidu.com")

#鼠标移动到某处
action1 = driver.find_element_by_id("su")
ActionChains(driver).move_to_element(action1).perform()

#鼠标移动到某处单击
action2 = driver.find_element_by_id("su")
ActionChains(driver).move_to_element(action2).click(action2).perform()

#鼠标移动到某处双击
action3 = driver.find_element_by_id("su")
ActionChains(driver).move_to_element(action3).double_click(action3).perform()

# 鼠标移动到某处右击
action4 = driver.find_element_by_id("su")
ActionChains(driver).move_to_element(action4).context_click(action4).perform()

Cookie

赢得页面每一个Cookie值:

for cookie in driver.get_cookies():
    print("%s -> %s" % (cookie['name'], cookie['value']))

删除Cookie:

# 通过Cookie名
driver.delete_cookie("CookieName")

# 删除所有
driver.delete_all_cookies()

4.Select表单

页面等待

于今的网页越多的选取了Ajax技能,那样程序便无法鲜明什么时候页面完全加载成功。假若实际页面等待时间过长导致有个别dom成分还没出来,不过你的代码直接利用了这么些WebElement,那么就能够抛出NullPointer的尤其。

为了防止那种成分定位困难而且大概会招致抛至极,所以Selenium提供了三种等待情势,壹种是隐式等待,一种是显式等待。

隐式等待是伺机特定的光阴,等待是点名某三个尺码建即刻继续实施。

遭遇下来框需求选取操作时,Selenium专门提供了Select类来拍卖下拉框

隐式等待

隐式等待相比较简单,正是轻易地设置3个等待时间,单位为秒。

from selenium import webdriver

driver = webdriver.Chrome()
# 等待10秒
driver.implicitly_wait(10) # seconds
driver.get("http://www.baidu.com/")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
# 导入 Select 类
from selenium.webdriver.support.ui import Select

# 找到 name 的选项卡
select = Select(driver.find_element_by_name('status'))

# 
select.select_by_index(1)
select.select_by_value("0")
select.select_by_visible_text(u"xxx")

显式等待

显式等待为钦命有个别条件,然后设置最长等待时间。若是在这么些日子内,钦定条件组建,则持续往下进行;借使在那些时间,钦点条件还未创造,那么便会抛出相当。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverWait 库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions 类,负责条件出发
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")
try:
    # 页面一直循环,直到 id="myDynamicElement" 出现
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

若果不写参数,程序私下认可会0.伍s调用一回来查阅元素是或不是业已加载成功,假若本来成分正是存在的,那么会立刻再次回到。

下边是部分放手的等候条件,能够直接调用那些条件,而不用自个儿写一些等待条件了。

title_is
title_contains
presence_of_element_located
visibility_of_element_located
visibility_of
presence_of_all_elements_located
text_to_be_present_in_element
text_to_be_present_in_element_value
frame_to_be_available_and_switch_to_it
invisibility_of_element_located
element_to_be_clickable – it is Displayed and Enabled.
staleness_of
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
alert_is_present

当然假设不安装,暗中认可等待时间为0。

 

上述是二种采取下拉框的不二等秘书籍,它能够依靠目录来选拔,能够依靠值来抉择,能够依据文字来抉择。注意:

  • index 索引从 0 开始
  • value是option标签的三个属性值,并不是体以后下拉框中的值
  • visible_text是在option标签文本的值,是映未来下拉框的值

凡事撤销方法

select.deselect_all()

五.弹窗管理

当页面出现了弹窗提醒

alert = driver.switch_to_alert()

澳门新萄京官方网站爬虫与反爬虫的战争,如何高效地爬大量数据。六.页面切换

一个浏览器断定会有成千上万窗口,所以大家必然要有方法来完结窗口的切换。切换窗口的艺术如下:

driver.switch_to.window("this is window name")

七.页前面进和滞后

操作页面包车型大巴开发进取和落后作用:

driver.forward()     #前进
driver.back()        # 后退

实例 模拟登录douban网址

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Firefox()
driver.get("http://www.douban.com")

# 输入账号密码
driver.find_element_by_name("form_email").send_keys("158xxxxxxxx")
driver.find_element_by_name("form_password").send_keys("zhxxxxxxxx")

# 模拟点击登录
driver.find_element_by_xpath("//input[@class='bn-submit']").click()

# 等待3秒
time.sleep(3)

# 生成登陆后快照
driver.save_screenshot(u"douban.png")

driver.quit()

 动态页面模拟点击--->>>爬取斗鱼全部房间名,观者人数

(1)首先分析‘’下一页‘’的class变化,假如不是最后一页的时候,‘下一页’的class如下

 澳门新萄京官方网站 2

(二)要是到了最后一页,‘下一页’变为隐藏,点击不了,class变为如下

澳门新萄京官方网站 3

(叁)找到个屋子的名字和观者人数的class

澳门新萄京官方网站 4

(4)代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import unittest
from selenium import webdriver
from bs4 import BeautifulSoup as bs

class douyu(unittest.TestCase):
    # 初始化方法,必须是setUp()
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.num = 0
        self.count = 0

    # 测试方法必须有test字样开头
    def testDouyu(self):
        self.driver.get("https://www.douyu.com/directory/all")

        while True:
            soup = bs(self.driver.page_source, "lxml")
            # 房间名, 返回列表
            names = soup.find_all("h3", {"class" : "ellipsis"})
            # 观众人数, 返回列表
            numbers = soup.find_all("span", {"class" :"dy-num fr"})

            # zip(names, numbers) 将name和number这两个列表合并为一个元组 : [(1, 2), (3, 4)...]
            for name, number in zip(names, numbers):
                print u"观众人数: -"   number.get_text().strip()   u"-t房间名: "   name.get_text().strip()
                self.num  = 1
                #self.count  = int(number.get_text().strip())

            # 如果在页面源码里找到"下一页"为隐藏的标签,就退出循环
            if self.driver.page_source.find("shark-pager-disable-next") != -1:
                    break

            # 一直点击下一页
            self.driver.find_element_by_class_name("shark-pager-next").click()

    # 测试结束执行的方法
    def tearDown(self):
        # 退出Firefox()浏览器
        print "当前网站直播人数"   str(self.num)
        print "当前网站观众人数"   str(self.count)
        self.driver.quit()

if __name__ == "__main__":
    # 启动测试模块
    unittest.main()

爬取的结果:

澳门新萄京官方网站 5

 

本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:澳门新萄京官方网站爬虫与反爬虫的战争,如何

关键词: