【4858.com】爬虫与反爬虫的战乱,怎么着作答网站反爬虫策略

By admin in 4858.com on 2019年3月9日

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

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),那之间的创新优品恢宏壮阔…

 

Selenium

Selenium是八个Web的自动化测试工具,最初是为网站自动化测试而支付的,类型像大家玩游戏用的按键天使,能够按钦赐的通令自动操作,分歧的是Selenium能够一贯运维在浏览器上,它协理具有主流的浏览器(包蕴PhantomJS这个无界面包车型地铁浏览器)。

Selenium能够根据大家的授命,让浏览器自动加载页面,获取供给的数据,甚至页面截屏,或许判断网站上一点动作是或不是产生。

Selenium本人不带浏览器,不援救浏览器的功能,它必要与第1方浏览器结合在联合才能使用。然则我们大多数时候须要让它内嵌在代码中运转,所以大家得以用1个叫PhantomJS的工具代替真实的浏览器。

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

Selenium
官方参考文书档案:

  • 小莫想要某站上全体的影片,写了正式的爬虫(基于HttpClient库),不断地遍历某站的摄像列表页面,依照Html 分析电影名字存进本身的数据库。

  • 这一个站点的运维小黎发现有些时刻段请求量陡增,分析日志发现都以IP(xxx.xxx.xxx.xxx)那么些用户,并且 user-agent 如故Python-urllib/2.7 ,基于那两点判断非人类后一贯在服务器上封杀。

  • 小莫电影只爬了四分之二,于是也针对的变换了下策略:1. user-agent
    效仿百度(“Baiduspider…”),2. IP每爬半个小时就换2个IP代理。

  • 小黎也意识了相应的变更,于是在服务器上设置了2个频率限制,每分钟超越1二十三遍呼吁的再屏蔽IP。
    同时考虑到百度家的爬虫有只怕会被误伤,想想市场机构每月几80000的排泄,于是写了个本子,通过
    hostname 检查下那些 ip 是或不是真的百度家的,对这一个 ip
    设置3个白名单。

  • 小莫发现了新的限定后,想着作者也不急着要那么些数量,留给服务器稳步爬吧,于是修改了代码,随机1-3秒爬3遍,爬拾伍回休息10秒,每日只在8-12,18-20点爬,隔几天还休息一下。

  • 小黎瞧着新的日志头都大了,再设定规则极大心会推延真实用户,于是准备换了三个思路,当二个小时的总请求超越四拾九次的时候弹出多少个验证码弹框,没有正确输入的话就把
    IP 记录进黑名单。

  • 小莫看到验证码有个别傻脸了,可是也不是尚未主意,先去上学了图像识别(关键词
    PIL,tesseract),再对验证码进行了二值化,分词,形式磨练未来,由此可见最后识别了小黎的验证码(关于验证码,验证码的辨识,验证码的反识别也是一个扩花月丽的加油史…),之后爬虫又跑了四起。

  • 小黎是个坚强的好同学,看到验证码被攻陷后,和开发同学讨论了变动下开发方式,数据并不再直接渲染,而是由前端同学异步获取,并且经过
    JavaScript 的加密库生成动态的 token,同时加密库再展开模糊。

  • 破绽百出过的加密库就没有艺术了么?当然不是,能够逐步调节和测试,找到加密原理,可是小莫不准备用这样耗费时间耗力的不二法门,他扬弃了基于
    HttpClient的爬虫,采用了放置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎运维页面,直接拿走了科学的结果,又二遍获得了对方的数额。

  • 小黎:…..

Selenium

Day 1
小莫想要某站上全部的影视,写了业内的爬虫(基于HttpClient库),不断地遍历某站的录制列表页面,根据Html 分析电影名字存进本人的数据库。
以此站点的运维小黎发现某些时刻段请求量陡增,分析日志发现都是IP(1.1.1.1)那个用户,并且 useragent 依然 JavaClient1.6
,基于那两点判断非人类后平素在Nginx 服务器上封闭扼杀。

【4858.com】爬虫与反爬虫的战乱,怎么着作答网站反爬虫策略。爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),那里面包车型客车斗争恢宏壮阔…

PhantomJS

PhantomJS是二个依据Webkit的“无界面”(headless)浏览器,它会把网站加载到内部存款和储蓄器并执行页面上的JavaScript,因为不会来得图形界面,所以运营起来比总体的浏览器要高效。

比方大家把Selenium和PhantomJS结合在联合署名,就足以运转三个卓殊强大的互联网爬虫了,那一个爬虫能够处理JavaScript、Cookie、headers,以及别的我们实在用户需求做的政工。

注意:PhantomJS
只可以从它的官方网站 下载。 因为
PhantomJS 是七个功用完善(即使无界面)的浏览器而非二个 Python
库,所以它不须求像 Python
的别的库一样安装,但大家得以通过Selenium调用PhantomJS来间接接纳。

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

 Selenium是八个Web的自动化测试工具,最初是为网站自动化测试而支出的,类型像大家玩游戏用的按键天使,能够按钦定的一声令下自动操作,不一样是Selenium
能够一直运转在浏览器上,它帮助全数主流的浏览器(包含PhantomJS那些无界面包车型客车浏览器)。

Day 2
小莫电影只爬了一半,于是也本着的转移了下策略:1. useragent
模仿百度(“Baiduspider…”),2. IP每爬半个钟头就换3个IP代理。
小黎也发觉了对应的转移,于是在 Nginx
上安装了二个频率限制,每分钟超越1二十一回呼吁的再屏蔽IP。
同时考虑到百度家的爬虫有恐怕会被误伤,想想市集机构每月几十万的投放,于是写了个本子,通过
hostname 检查下那一个 ip 是否真的百度家的,对那么些 ip 设置二个白名单。

Day 1

小莫想要某站上全体的电影,写了业内的爬虫(基于HttpClient库),不断地遍历某站的电影和电视列表页面,依照Html 分析电影名字存进自身的数据库。
其一站点的运行小黎意识有个别时间段请求量陡增,分析日志发现都以IP(1.1.1.1)那个用户,并且 useragent 照旧 JavaClient1.6
,基于那两点判断非人类后一贯在Nginx 服务器上封闭扼杀。

飞快入门

SeleniumCurry有个叫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 Files\phantomjs\bin\phantomjs")

# 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
能够依照大家的命令,让浏览器自动加载页面,获取供给的数码,甚至页面截屏,也许判断网站上或多或少动作是否爆发。

Day 3
小莫发现了新的界定后,想着笔者也不急着要那个数量,留给服务器渐渐爬吧,于是修改了代码,随机1-3秒爬二回,爬拾三回休息10秒,每日只在8-12,18-20点爬,隔几天还休息一下。
小黎望着新的日志头都大了,再设定规则相当大心会损害真实用户,于是准备换了1个思路,当二个钟头的总请求抢先肆十五次的时候弹出二个验证码弹框,没有精确科学输入的话就把
IP 记录进黑名单。

Day 2

4858.com,小莫电影只爬了大体上,于是也本着的转换了下策略:1. useragent
模拟百度(“Baiduspider…”),2. IP每爬半个钟头就换1个IP代理。
小黎也发现了相应的浮动,于是在 Nginx
上设置了一个频率限制,每秒钟超越1二十四遍呼吁的再屏蔽IP。
同时考虑到百度家的爬虫有只怕会被误伤,想想市镇部门每月几八万的投放,于是写了个剧本,通过
hostname 检查下那些 ip 是还是不是真的百度家的,对那几个 ip 设置三个白名单。

页面操作

Selenium的WebDriver提供了各个法子来寻觅成分,假若下边有2个表单输入框:

<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
自个儿不带浏览器,不帮助浏览器的法力,它必要与第3方浏览器结合在同步才能使用.

Day 4
小莫看到验证码有个别傻脸了,可是也不是尚未章程,先去上学了图像识别(关键词
PIL,tesseract),再对验证码进行了二值化,分词,形式陶冶以往,识别了小黎的验证码(关于验证码,验证码的识别,验证码的反识别也是贰个恢宏壮丽的斗争史,那里先不展开….),之后爬虫又跑了四起。
小黎是个坚强的好同学,看到验证码被拿下后,和耗费同学商量了变化下开发形式,数据并不再直接渲染,而是由前端同学异步获取,并且经过
js 的加密库生成动态的
token,同时加密库再开始展览模糊(比较根本的步子的确有网站那样做,参见腾讯网的登陆流程)。

Day 3

小莫发现了新的限定后,想着作者也不急着要这几个多少,留给服务器逐步爬吧,于是修改了代码,随机1-3秒爬一遍,爬11遍休息10秒,天天只在8-12,18-20点爬,隔几天还休息一下。
小黎望着新的日志头都大了,再设定规则十分的大心会推延真实用户,于是准备换了三个思路,当一个钟头的总请求超越伍十二遍的时候弹出1个验证码弹框,没有确切科学输入的话就把
IP 记录进黑名单。

定位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

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

Day5
模糊过的加密库就平素不艺术了么?当然不是,能够逐步调节和测试,找到加密原理,然而小莫不准备用如此耗费时间耗力的法子,他舍弃了根据HttpClient的爬虫,选取了放置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎中js
加密脚本算出了正确的结果,又2回获得了对方的数码。
小黎:…..

Day 4

小莫看到验证码某些傻脸了,可是也不是绝非办法,先去学习了图像识别(关键词
PIL,tesseract),再对验证码进行了二值化,分词,情势磨练今后,识别了小黎的验证码(关于验证码,验证码的辨别,验证码的反识别也是2个扩大壮丽的斗争史,这里先不展开….),之后爬虫又跑了起来。
小黎是个坚强的好同学,看到验证码被占领后,和付出同学切磋了变通下支付形式,数据并不再直接渲染,而是由前端同学异步获取,并且通过
js 的加密库生成动态的
token,同时加密库再开始展览模糊(相比较重要的步子的确有网站那样做,参见新浪的登陆流程)。

1.by id

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

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

firefox的目录也要添加到环境变量中

爬虫与发爬虫的奋斗还在持续。
可是实在使用时候,一般大家做到根据 IP
限制频次就得了了,除非很核心的数目,不会再开始展览更加多的辨证,终归工程的题材3/6是基金的题目。

Day 5

张冠李戴过的加密库就没有艺术了么?当然不是,能够慢慢调节和测试,找到加密原理,不过小也许准备用这么耗费时间耗力的章程,他吐弃了依据HttpClient的爬虫,选拔了放置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎中js
加密脚本算出了未可厚非的结果,又2次得到了对方的数量。
小黎:…..

爬虫与发爬虫的冲刺还在三番五次。
而是实在运用时候,一般大家做到遵照 IP
限制频次就得了了,除非很宗旨的数码,不会再拓展更加多的申明,终归工程的题材5/10是花费的难点。

至于高效部分,一些 Tips:
1.尽量减小请求次数,能抓列表页就不抓详情页
2.永不只看 Web 网站,还有 App 和 H5,他们的反爬虫措施一般比较少
3.假如真的对质量须求很高,能够设想二十四线程(一些老奸巨猾的框架如
scrapy都已协理),甚至分布式

 

作者:申玉宝
链接:

 

2.by name

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

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

Selenium Curry有个叫 WebDriver 的
API。WebDriver 有点儿像可以加载网站的浏览器,可是它也足以像
BeautifulSoup 恐怕其余 Selector
对象一样用来寻觅页面成分,与页面上的成分举行相互(发送文书、点击等),以及实施其余动作来运营网络爬虫。

至于高效部分,一些 Tips:
1.尽量缩减请求次数,能抓列表页就不抓详情页
2.并非只看 Web 网站,还有 App 和 H5,他们的反爬虫措施一般相比少
3.就算真的对质量须求很高,能够考虑四线程(一些老奸巨猾的框架如
scrapy都已帮助),甚至分布式

3.by xpath

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

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

selenium飞速入门

4.by link text

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

# 实现
element = driver.find_element_by_link_text("cheese")
#!/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")

1.页面操作

6.by tag name

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

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

假定有下边包车型大巴输入框

7.by class name

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

# 实现
element = driver.find_elements_by_class_name("div")
<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")

寻找办法

鼠标动作链

有点时候,我们需求在页面上模拟一些鼠标操作,比如双击、右击、拖拽甚至按住不动等,我们得以因此导入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()
# 获取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>

  4858.com 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标签的1个属性值,并不是浮以往下拉框中的值
  • visible_text 是option标签文本的值,是显示在下拉框的值

全副撤销采用:select.deselect_all()

2.定点元素的方式

弹窗处理

当您触发了有些事件随后,页面出现了弹窗提示,处理那一个提示或许取得提示音信方法:

alert = driver.switch_to_alert()
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

页面切换

3个浏览器肯定会有那多少个窗口,所以我们肯定要有主意来兑现窗口的切换。切换窗口的法子如下:

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

也得以应用window_handles 方法来赢得各类窗口的操作对象。

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

3.鼠标动作

页前边进和向下

操作页面包车型地铁发展和退化功用:

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类来拍卖下拉框

隐式等待

隐式等待相比简单,正是简单地安装叁个等候时间,单位为秒。

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.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

当然若是不安装,暗许等待时间为0。

 

以上是二种采用下拉框的格局,它能够依照目录来选拔,能够依照值来抉择,能够依据文字来摘取。注意:

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

整整裁撤方法

select.deselect_all()

5.弹窗处理

当页面出现了弹窗提醒

alert = driver.switch_to_alert()

6.页面切换

几个浏览器肯定会有诸多窗口,所以我们终将要有艺术来贯彻窗口的切换。切换窗口的不二法门如下:

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

7.页前边进和退化

操作页面包车型客车上进和滞后功效:

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如下

 4858.com 2

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

4858.com 3

(3)找到个屋子的名字和观众人数的class

4858.com 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()

爬取的结果:

4858.com 5

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有