您的位置:新葡亰496net > 奥门新萄京娱乐场 > python爬虫入门,爬虫与反爬虫的粉尘

python爬虫入门,爬虫与反爬虫的粉尘

发布时间:2019-06-16 03:48编辑:奥门新萄京娱乐场浏览(69)

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

     

    新葡亰496net,爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),那之间的努力恢宏壮阔...

    Selenium

    Selenium是二个Web的自动化测试工具,最初是为网址自动化测试而支付的,类型像大家玩游戏用的按钮精灵,可以按钦赐的命令自动操作,分裂的是Selenium可以直接运营在浏览器上,它支持具有主流的浏览器(包涵PhantomJS这一个无分界面的浏览器)。

    Selenium能够依照大家的命令,让浏览器自动加载页面,获取要求的数码,以致页面截屏,可能判别网址上一些动作是还是不是产生。

    Selenium本身不带浏览器,不支持浏览器的功力,它要求与第三方浏览器结合在一道工夫选取。可是大家抢先三分之一时候供给让它内嵌在代码中运营,所以大家能够用贰个叫PhantomJS的工具替代真实的浏览器。

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

    Selenium 官方参考文档:

    1,Selenium

    Selenium是一个Web的自动化测试工具,最初是为网址自动化测试而支付的,类型像大家玩游戏用的按钮Smart,能够按钦定的一声令下自动操作,区别是Selenium 能够直接运维在浏览器上,它支持具备主流的浏览器(包蕴PhantomJS这几个无分界面包车型地铁浏览器)。

    Selenium 能够依照大家的一声令下,让浏览器自动加载页面,获取需求的数量,以至页面截屏,只怕判别网址上有个别动作是或不是产生。

    Selenium 本人不带浏览器,不援助浏览器的效力,它须求与第三方浏览器结合在一块儿本领使用。然而大家临时要求让它内嵌在代码中运行,所以大家得以用一个叫 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.7 ,基于这两点判别非人类后间接在服务器上封闭扼杀。

    • 小莫电影只爬了轮廓上,于是也本着的调换了下计谋:1. user-agent 模拟百度("Baiduspider..."),2. IP每爬半个钟头就换三个IP代理。

    • 小黎也意识了对应的浮动,于是在服务器上安装了一个频率限制,每分钟超过1二十四遍呼吁的再屏蔽IP。 同期牵记到百度家的爬虫有极大可能率会被误伤,想想市集部门每月几八万的排泄,于是写了个剧本,通过 hostname 检查下那些 ip 是还是不是真的百度家的,对那个 ip 设置一个白名单。

    • 小莫开掘了新的界定后,想着笔者也不急着要那一个数量,留给服务器逐步爬吧,于是修改了代码,随机1-3秒爬二遍,爬10遍苏息10秒,天天只在8-12,18-20点爬,隔几天还休息一下。

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

    • 小莫看到验证码某个傻脸了,可是也不是未曾主意,先去读书了图像识别(关键词 PIL,tesseract),再对验证码举办了二值化,分词,方式练习之后,综上可得最后识别了小黎的验证码(关于验证码,验证码的鉴定分别,验证码的反识别也是一个恢弘壮丽的冲上大夫...),之后爬虫又跑了起来。

    • 小黎是个坚强的好同学,看到验证码被拿下后,和支付同学切磋了扭转下开辟方式,数据并不再直接渲染,而是由前端同学异步获取,并且通过 JavaScript 的加密库生成动态的 token,同期加密库再拓展模糊。

    • 混淆过的加密库就从未有过章程了么?当然不是,能够慢慢调节和测试,找到加密原理,可是小或然盘算用那样耗费时间耗力的章程,他放任了依赖HttpClient的爬虫,选择了放置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎运维页面,直接拿走了天经地义的结果,又一遍获得了对方的数量。

    • 小黎:.....

    Selenium

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

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

    PhantomJS

    PhantomJS是贰个基于Webkit的“无界面”(headless)浏览器,它会把网址加载到内部存款和储蓄器并举行页面上的JavaScript,因为不会议及展览示图形分界面,所以运营起来比全体的浏览器要高效。

    借使我们把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.1.1)这一个用户,并且 useragent 照旧 JavaClient1.6 ,基于这两点判定非人类后直接在Nginx 服务器上封闭扼杀。

    Day 2
    小莫电影只爬了大意上,于是也本着的转换了下攻略:1. useragent 模拟百度("Baiduspider..."),2. IP每爬半个钟头就换一个IP代理。
    小黎也意识了对应的退换,于是在 Nginx 上安装了三个频率限制,每分钟抢先1二十二回呼吁的再屏蔽IP。 同期思索到百度家的爬虫有望会被误伤,想想市集机构每月几十万的排泄,于是写了个本子,通过 hostname 检查下这些 ip 是或不是真的百度家的,对这一个 ip 设置贰个白名单。

    敏捷入门

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

    3,轻巧操作

    Selenium 库里有个叫 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

    小莫电影只爬了大要上,于是也针对的调换了下战术:1. useragent 模拟百度("Baiduspider..."),2. IP每爬半个钟头就换多少个IP代理。
    小黎也意识了对应的变化,于是在 Nginx 上安装了一个频率限制,每分钟抢先1二十一回呼吁的再屏蔽IP。 同不时常候思索到百度家的爬虫有望会被误伤,想想市集部门每月几八千0的排泄,于是写了个剧本,通过 hostname 检查下那些 ip 是或不是真的百度家的,对那几个 ip 设置八个白名单。

    Day 3
    小莫开掘了新的限量后,想着笔者也不急着要那几个数量,留给服务器逐步爬吧,于是修改了代码,随机1-3秒爬二遍,爬11次暂息10秒,天天只在8-12,18-20点爬,隔几天还停息一下。
    小黎望着新的日志头都大了,再设定规则极大心会损伤真实用户,于是筹算换了贰个思路,当3个钟头的总请求当先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']")
    

    4,页面操作

    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 自个儿不带浏览器,不支持浏览器的效应,它要求与第三方浏览器结合在联合技能使用.

    Day 3

    小莫发掘了新的限量后,想着我也不急着要这个数量,留给服务器逐步爬吧,于是修改了代码,随机1-3秒爬二回,爬11次休息10秒,每日只在8-12,18-20点爬,隔几天还停歇一下。
    小黎望着新的日志头都大了,再设定规则极大心会挫伤真实用户,于是希图换了五个思路,当3个钟头的总请求超越伍十二回的时候弹出一个验证码弹框,未有可相信科学输入的话就把 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),再对验证码实行了二值化,分词,方式练习之后,识别了小黎的验证码(关于验证码,验证码的甄别,验证码的反识别也是三个恢弘壮丽的斗争史,这里先不张开....),之后爬虫又跑了四起。
    小黎是个坚强的好同学,看到验证码被攻陷后,和支出同学研讨了扭转下开辟形式,数据并不再间接渲染,而是由前端同学异步获取,并且经过 js 的加密库生成动态的 token,相同的时候加密库再张开模糊(相比重要的步子的确有网址那样做,参见今日头条的登录流程)。

    Day5
    模糊过的加密库就从未有过章程了么?当然不是,能够稳步调节和测试,找到加密原理,但是小可能希图用那样耗时耗力的艺术,他扬弃了依据HttpClient的爬虫,接纳了放置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎中js 加密脚本算出了精确的结果,又一遍获得了对方的数目。
    小黎:.....

    1.by id

    # 页面内容
    <div id="coolestWidgetEvah">...</div>
    
    # 实现
    element = driver.find_element_by_id(coolestWidgetEvah")
    

    6,鼠标动作链

    些微时候,我们须要再页面上模仿一些鼠标操作,比方双击、右击、拖拽以至按住不动等,大家得以经过导入 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 限制频次就截止了,除非很焦点的数量,不会再张开更加的多的认证,毕竟工程的主题材料50%是成本的标题。

    关于高效部分,一些 Tips:
    1.尽量滑坡请求次数,能抓列表页就不抓实际情况页
    2.不用只看 Web 网址,还应该有 App 和 H5,他们的反爬虫措施一般相比较少
    3.倘若真的对品质必要异常高,能够设想二十四线程(一些成熟的框架如 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:
    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")
    

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

    9,页面切换

    三个浏览器确定会有为数非常的多窗口,所以咱们一定要有措施来促成窗口的切换。切换窗口的方法如下:

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

    10,页前边进和倒退

    操作页面包车型大巴前行和落后成效:

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

    1.页面操作

    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 提供了两种等待情势,一种是隐式等待,一种是显式等待。

    隐式等待是伺机特定的年华,显式等待是点名某一尺码直到那几个标准建立时继续试行。

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

    隐式等待

    隐式等待比较轻便,便是轻易地安装二个等候时间,单位为秒。

    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>
    

      新葡亰496net 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()

    13,模拟网址登入

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

    2.固定成分的不二诀窍

    弹窗管理

    当您触发了某些事件未来,页面出现了弹窗提醒,管理这一个提醒大概猎取提醒新闻方法:

    alert = driver.switch_to_alert()
    

    14,动态页面模拟点击

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

    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表单

    页面等待

    python爬虫入门,爬虫与反爬虫的粉尘。未来的网页越多的接纳了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。

     

    python爬虫入门,爬虫与反爬虫的粉尘。以上是三种采用下拉框的法子,它能够依据目录来抉择,能够依靠值来摘取,能够依附文字来摘取。注意:

    • 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")
    

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

     新葡亰496net 2

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

    新葡亰496net 3

    (3)找到个房子的名字和听芸芸众生数的class

    新葡亰496net 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()
    

    爬取的结果:

    新葡亰496net 5

     

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:python爬虫入门,爬虫与反爬虫的粉尘

    关键词: