如何回答网址反爬虫计策,Selenium模拟用户操作

2019-05-03 22:24 来源:未知

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

 

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

Day 1
小莫想要某站上全部的电影和电视,写了正式的爬虫(基于HttpClient库),不断地遍历某站的录像列表页面,依据Html 分析电影名字存进本身的数据库。
那些站点的运转小黎意识有个别时刻段请求量陡增,分析日志开采都以IP(一.一.一.一)那么些用户,并且 useragent 依然 JavaClient一.6,基于这两点推断非人类后从来在Nginx 服务器上封闭扼杀。

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),那时期的埋头苦干恢宏壮阔...

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

  • 以此站点的运转小黎意识有些时刻段请求量陡增,分析日志开采都以IP(xxx.xxx.xxx.xxx)那个用户,并且 user-agent 仍旧Python-urllib/二.7 ,基于这两点判别非人类后平素在服务器上封闭扼杀。

  • 小莫电影只爬了二分之一,于是也针对的转移了下攻略:1. user-agent 仿照百度("Baiduspider..."),二. IP每爬半个小时就换二个IP代理。

  • 小黎也发觉了相应的变型,于是在服务器上设置了3个功能限制,每分钟超越1二十回呼吁的再屏蔽IP。 同时思量到百度家的爬虫有极大或许会被误伤,想想市四机构每月几九千0的投放,于是写了个本子,通过 hostname 检查下那么些 ip 是还是不是真的百度家的,对这个 ip 设置四个白名单。

  • 小莫开掘了新的界定后,想着小编也不急着要那个多少,留给服务器渐渐爬吧,于是修改了代码,随机一-3秒爬3次,爬11次安歇十秒,每日只在8-1二,1八-20点爬,隔几天还安歇一下。

  • 小黎看着新的日志头都大了,再设定规则一点都不小心会有毒真实用户,于是筹划换了三个思路,当二个钟头的总请求抢先伍十二遍的时候弹出二个验证码弹框,未有科学输入的话就把 IP 记录进黑名单。

  • 小莫看到验证码有个别傻脸了,不过也不是一向不章程,先去上学了图像识别(关键词 PIL,tesseract),再对验证码举办了二值化,分词,格局磨练未来,综上说述最终识别了小黎的验证码(关于验证码,验证码的辨识,验证码的反识别也是三个恢弘壮丽的持之以恒史...),之后爬虫又跑了四起。

  • 小黎是个坚强的好同学,看到验证码被攻占后,和支付同学商量了变化下支付形式,数据并不再直接渲染,而是由前端同学异步获取,并且经过 JavaScript 的加密库生成动态的 token,同时加密库再进行模糊。

  • 模糊过的加密库就从未有过艺术了么?当然不是,能够逐步调节和测试,找到加密原理,可是小也许计划用这样耗时耗力的秘籍,他废弃了依靠HttpClient的爬虫,接纳了内置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎运营页面,直接获得了不错的结果,又贰遍获得了对方的数码。

  • 小黎:.....

Selenium

Day 2
小莫电影只爬了四分之二,于是也针对的调换了下战略:一. useragent 仿照百度("Baiduspider..."),二. IP每爬半个小时就换多少个IP代理。
小黎也意识了相应的变通,于是在 Nginx 上安装了一个功效限制,每分钟当先12十九次呼吁的再屏蔽IP。 同时考虑到百度家的爬虫有望会被误伤,想想市廛部门每月几100000的投放,于是写了个剧本,通过 hostname 检查下那一个 ip 是或不是真的百度家的,对这几个 ip 设置四个白名单。

Day 1

小莫想要某站上全数的影片,写了正规化的爬虫(基于HttpClient库),不断地遍历某站的影视列表页面,遵照Html 分析电影名字存进本身的数据库。
本条站点的运转小黎开掘有些时间段请求量陡增,分析日志发掘都以IP(1.壹.一.1)那么些用户,并且 useragent 照旧 JavaClient一.陆,基于那两点判定非人类后直接在Nginx 服务器上封杀。

 Selenium是三个Web的自动化测试工具,最初是为网址自动化测试而支出的,类型像大家玩游戏用的按键Smart,能够按钦点的命令自动操作,分裂是Selenium 能够平昔运维在浏览器上,它帮助全部主流的浏览器(包蕴PhantomJS这一个无界面包车型客车浏览器)。

Day 3
小莫发现了新的限制后,想着笔者也不急着要这一个多少,留给服务器渐渐爬吧,于是修改了代码,随机1-3秒爬2回,爬10次止息10秒,天天只在八-1二,1八-20点爬,隔几天还休息一下。
小黎望着新的日志头都大了,再设定规则不小心会损伤真实用户,于是筹划换了3个思路,当一个钟头的总请求当先四十七回的时候弹出3个验证码弹框,未有标准科学输入的话就把 IP 记录进黑名单。

Day 2

小莫电影只爬了二分一,于是也针对的转变了下计策:一. useragent 效仿百度("Baiduspider..."),二. IP每爬半个小时就换多个IP代理。
小黎也意识了相应的变动,于是在 Nginx 上设置了二个功效限制,每秒钟超越1二十二次呼吁的再屏蔽IP。 同时考虑到百度家的爬虫有极大或许会被误伤,想想市场机构每月几八千0的投放,于是写了个剧本,通过 hostname 检查下这么些 ip 是否真的百度家的,对那几个 ip 设置2个白名单。

Selenium 能够依照大家的授命,让浏览器自动加载页面,获取供给的多寡,以致页面截屏,只怕决断网址上有个别动作是或不是产生。

Day 4
小莫看到验证码有些傻脸了,然而也不是绝非艺术,先去学学了图像识别(关键词 PIL,tesseract),再对验证码实行了二值化,分词,形式练习之后,识别了小黎的验证码(关于验证码,验证码的分辨,验证码的反识别也是三个恢宏壮丽的斗争史,这里先不展开....),之后爬虫又跑了起来。
小黎是个坚强的好同学,看到验证码被攻克后,和支出同学商讨了变通下开垦情势,数据并不再直接渲染,而是由前端同学异步获取,并且经过 js 的加密库生成动态的 token,同时加密库再打开模糊(相比主要的手续的确有网址那样做,参见博客园的登录流程)。

Day 3

小莫发现了新的限定后,想着作者也不急着要那些数据,留给服务器稳步爬吧,于是修改了代码,随机一-3秒爬3回,爬13次安歇十秒,每一日只在8-12,1捌-20点爬,隔几天还停歇一下。
小黎瞧着新的日志头都大了,再设定规则非常的大心会加害真实用户,于是筹划换了三个思路,当一个时辰的总请求超过38回的时候弹出贰个验证码弹框,未有准确科学输入的话就把 IP 记录进黑名单。

Selenium 自个儿不带浏览器,不援救浏览器的功力,它需求与第壹方浏览器结合在联合才具使用.

Day5
模糊过的加密库就从不章程了么?当然不是,能够慢慢调节和测试,找到加密原理,可是小莫不希图用这么耗费时间耗力的不贰诀要,他扬弃了基于 HttpClient的爬虫,选择了内置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎中js 加密脚本算出了不错的结果,又一回得到了对方的数码。
小黎:.....

Day 4

小莫看到验证码有个别傻脸了,但是也不是从未艺术,先去学学了图像识别(关键词 PIL,tesseract),再对验证码举办了2值化,分词,格局练习之后,识别了小黎的验证码(关于验证码,验证码的辨认,验证码的反识别也是三个恢宏壮丽的斗争史,这里先不张开....),之后爬虫又跑了起来。
小黎是个坚强的好同学,看到验证码被一锅端后,和支出同学探究了变化下开荒格局,数据并不再直接渲染,而是由前端同学异步获取,并且经过 js 的加密库生成动态的 token,同时加密库再打开模糊(比较首要的步子的确有网址那样做,参见天涯论坛的登录流程)。

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

爬虫与发爬虫的拼搏还在雄起雌伏。
只是实在使用时候,一般我们做到依据 IP 限制频次就离世了,除非很宗旨的数额,不会再实行越来越多的评释,究竟工程的主题材料十分之五是资本的主题素材。

Day 5

混淆过的加密库就从未办法了么?当然不是,可以稳步调试,找到加密原理,不过小莫不打算用如此耗费时间耗力的主意,他扬弃了依照HttpClient的爬虫,选拔了放置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎中js 加密脚本算出了科学的结果,又三遍获得了对方的数额。
小黎:.....

爬虫与发爬虫的斗争还在后续。
www.weide1946.com,但是事实上行使时候,一般大家做到依照 IP 限制频次就终止了,除非很核心的多少,不会再拓展更多的认证,究竟工程的难题5/10是基金的难点。

至于高效部分,一些 Tips:
一.尽量压缩请求次数,能抓列表页就不抓详细情形页
贰.不用只看 Web 网站,还有 App 和 H伍,他们的反爬虫措施一般相比较少
叁.借使真的对质量供给非常高,能够设想多线程(一些大巧若拙的框架如 scrapy都已帮助),乃至布满式

 

作者:申玉宝
链接:

 

firefox的目录也要加多到碰到变量中

关于高效部分,一些 Tips:
壹.尽量裁减请求次数,能抓列表页就不抓详细的情况页
二.并非只看 Web 网址,还有 App 和 H伍,他们的反爬虫措施一般比较少
三.要是真的对品质须要相当高,能够设想二十八线程(一些早熟的框架如 scrapy都已支持),以至分布式

Selenium Curry有个叫 WebDriver 的 API。WebDriver 有点儿像能够加载网址的浏览器,然则它也能够像 BeautifulSoup 恐怕其余 Selector 对象一样用来搜索页面元素,与页面上的成分进行互动 (发送文书、点击等),以及执行其余动作来运行互联网爬虫。

selenium飞快入门

#!/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()

一.页面操作

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

<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']")

贰.一定元素的办法

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.鼠标动作

#!/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()

4.Select表单

遇上下来框须求选拔操作时,Selenium专门提供了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"xxx")

上述是二种选拔下拉框的格局,它能够依据目录来摘取,能够凭借值来摘取,能够依据文字来挑选。注意:

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

总体收回方法

select.deselect_all()

5.弹窗处理

当页面出现了弹窗提醒

alert = driver.switch_to_alert()

6.页面切换

一个浏览器料定会有广大窗口,所以咱们终就要有艺术来落成窗口的切换。切换窗口的艺术如下:

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)首先分析‘’下1页‘’的class变化,借使不是最终1页的时候,‘下1页’的class如下

 www.weide1946.com 1

(贰)若是到了最终一页,‘下一页’变为隐藏,点击不了,class变为如下

www.weide1946.com 2

(三)找到个房间的名字和听大千世界数的class

www.weide1946.com 3

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

爬取的结果:

www.weide1946.com 4

 

版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于网络编程,转载请注明出处:如何回答网址反爬虫计策,Selenium模拟用户操作