zoukankan      html  css  js  c++  java
  • Python网络爬虫 第六章 自动化

    一、selenium引入概述

    我们在抓取⼀些普通⽹⻚的时候requests基本上是可以满⾜的,但是,如果遇到⼀些特殊的⽹站,它的数据是经过加密的,但是浏览器却能够正常显示出来。那我们通过requests抓取到的内容可能就不是我们想要的结果了。 例如,电影票房数据,在浏览器上看的时候是正常的。那么按照之前的逻辑,我们只需要看看数据是通过哪个请求拿到的就可以进⾏模拟请求了。
    但是!

     简单介绍⼀下selenium, 它本身是⼀个⾃动化测试的⼯具. 可以启动⼀个全新的浏览器.并从浏览器中提取到你想要的内容. 随着各种⽹站的反爬机制的出现. selenium越来越受到各位爬sir的喜爱.

    selenium最⼤的缺点其实就⼀个, 慢! 你想啊. 他要启动⼀个第三⽅的软件(浏览器), 并且还要等待浏览器把数据渲染完毕. 这个过程必然是很耗时的. 所以它慢.

    接下来, 我们来聊聊selenium如何安装和使⽤.
    就像其他第三⽅库⼀样, selenium直接⽤pip就可以安装了

    pip install selenium

    但是呢, 它与其他库不同的地⽅是他要启动你电脑上的浏览器, 这就需要⼀个驱动程序来辅助.
    chrome驱动地址:https://npm.taobao.org/mirrors/chromedriver
    这⾥推荐⽤chrome浏览器. 其他浏览器的驱动请⾃⾏百度.

     我这里是windows系统就选择win32

     然后关键的来了. 把你下载的浏览器驱动放在程序所在的⽂件夹. 或者放到python解释器所在的⽂件夹. 两种⼆选其⼀.

    python解释器的文件夹在Console上便能看到

     OK~ 前期准备⼯作完毕. 上代码看看, selenium是个什么⻤

    # 让selenium启动谷歌浏览器
    from selenium.webdriver import Chrome
    
    # 1.创建浏览器对象
    web = Chrome()
    # 2.打开一个网址
    web.get("http://www.baidu.com")
    
    print(web.title)

    运⾏⼀下你会发现神奇的事情发⽣了. 浏览器⾃动打开了. 并且输⼊了⽹址. 也能拿到⽹⻚上的title标题.

    二、selenium各种神奇操作

    selenium不但可以打开浏览器. 还可以对浏览器各种操作. ⽐如, 点 击, 查找. 都可以.
    我们直接上案例. 抓取拉钩⽹招聘python⼯程师的招聘信息

    1、准备⼯作

    2、点击-全国按钮

    想要点击这个按钮. 我们需要先定位到这个按钮. 然后再点击selenium想要定位某个元素. 太简单了.

    
    web = Chrome()
    
    web.get("http://lagou.com")
    
    # 找到某个元素. 点击它
    el = web.find_element_by_xpath('//*[@id="changeCityBox"]/ul/li[1]/a')
    el.click()  # 点击事件

    3、搜索python

    ⼈的过程: 找到⽂本框输⼊"python", 点击"搜索"按钮.
    机器的过程: 找到⽂本框输⼊"python", 点击"搜索"按钮.
    发现没, ⽤selenium最爽的地⽅就是这⾥. ⼈是怎么操作的. 机器就怎么操作.

    web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python") 
    web.find_element_by_xpath('//*[@id="search_button"]').click()

    send_keys() 这⾥要说⼀下. 如果我们给出的是⼀个字符串. 就是输⼊⽂本. 但是, 如果给出的是⼀个键盘指令, 那就按下键盘. ⽐ 如, 我想要按回⻋按钮. 就是这样的

    # 找到输入框. 输入python  =>  输入回车/点击搜索按钮
    web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python", Keys.ENTER)

    4、提取招聘信息

    from selenium.webdriver import Chrome
    from selenium.webdriver.common.keys import Keys  # 键盘指令
    
    import time
    
    web = Chrome()
    
    web.get("http://lagou.com")
    
    # 找到某个元素. 点击它
    el = web.find_element_by_xpath('//*[@id="changeCityBox"]/ul/li[1]/a')
    el.click()  # 点击事件
    
    time.sleep(1)  # 让浏览器缓一会儿 等ajax数据加载
    
    # 找到输入框. 输入python  =>  输入回车/点击搜索按钮
    web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python", Keys.ENTER)
    
    time.sleep(1)
    
    # 查找存放数据的位置. 进行数据提取
    # 找到页面中存放数据的所有的li
    li_list = web.find_elements_by_xpath('//*[@id="s_position_list"]/ul/li')
    for li in li_list:
        job_name = li.find_element_by_tag_name("h3").text
        job_price = li.find_element_by_xpath("./div[1]/div[1]/div[2]/div/span").text
        company_name = li.find_element_by_xpath('./div[1]/div[2]/div/a').text
        print(company_name, job_name, job_price)
    
    
    # 自动屏蔽掉了一些js加密解密问题,轻松多了

    5、多窗口调度

    上面说到我们已经可以通过selenium拿到拉钩⽹的招聘信息了. 但是, 信息不够全⾯. 我们希望得到的不仅仅是⼀个岗位名称和公司名称, 我更想知道更加详细的职位描述以及岗位要求

    此时问题就来了. 我们可以在搜索⻚⾯点击进⼊到这个详情⻚. 然后就可以看到想要的职位描述了. 但是, 这时就涉及到如何从⼀个窗⼝转向另⼀个窗⼝了(切换选项卡).
    ⾸先, 我们先通过selenium定位到搜索⻚上的职位超链接

    from selenium.webdriver import Chrome
    from selenium.webdriver.common.keys import Keys
    import time
    web = Chrome()
    
    web.get("http://lagou.com")
    
    web.find_element_by_xpath('//*[@id="cboxClose"]').click()
    
    time.sleep(1)
    
    web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python", Keys.ENTER)
    
    time.sleep(1)
    web.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[1]/div[1]/div[1]/div[1]/a/h3').click()

    注意! 我们看到的是新窗⼝的内容, 但是在selenium的视⻆⾥, 窗⼝依然停留在刚才那个窗⼝. 此时, 必须要将窗⼝调整到最新的窗⼝上才可以

    # 如何进入到进窗口中进行提取
    # 注意, 在selenium的眼中. 新窗口默认是不切换过来的. -1最后一个窗口
    web.switch_to.window(web.window_handles[-1])
    
    # 在新窗口中提取内容
    job_detail = web.find_element_by_xpath('//*[@id="job_detail"]/dd[2]/div').text
    print(job_detail)

    6 、无头浏览器

    我们已经基本了解了selenium的基本使⽤了. 但是呢, 不知各位有没有发现, 每次打开浏览器的时间都⽐较⻓. 这就⽐较耗时了. 我们写的是爬⾍程序. ⽬的是数据. 并不是想看⽹⻚. 那能不能让浏览器在后台跑呢? 答案是可以的,只需要配置好参数即可。

    # 准备好参数配置
    opt = Options()
    # 无头
    opt.add_argument("--headless")
    # 不显示 让程序在后台运行
    opt.add_argument("--disbale-gpu")
    
    web = Chrome(options=opt)  # 把参数配置设置到浏览器中

    直接上案例吧. 拿出最开始我们看到的那个⽹⻚. 抓取电影票房.

    from selenium.webdriver import Chrome
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.select import Select
    import time
    
    # 准备好参数配置
    opt = Options()
    # 无头
    opt.add_argument("--headless")
    # 不显示 让程序在后台运行
    opt.add_argument("--disbale-gpu")
    
    web = Chrome(options=opt)  # 把参数配置设置到浏览器中
    
    web.get("https://www.endata.com.cn/BoxOffice/BO/Year/index.html")
    
    time.sleep(2)
    # 定位到下拉列表
    sel_el = web.find_element_by_xpath('//*[@id="OptionDate"]')
    # 对元素进行包装, 包装成下拉菜单
    sel = Select(sel_el)
    # 让浏览器进行调整选项
    for i in range(len(sel.options)):  # i就是每一个下拉框选项的索引位置
        sel.select_by_index(i)  # 按照索引进行切换
        time.sleep(2)
        table = web.find_element_by_xpath('//*[@id="TableList"]/table')
        print(table.text)  # 打印所有文本信息
        print("===================================")
    
    print("运行完毕.  ")
    web.close()
    
    
    # 如何拿到页面代码Elements(经过数据加载以及js执行之后的结果的html内容)
    print(web.page_source)

    三、超级鹰解决验证码

    作者:王陸

    -------------------------------------------

    个性签名:罔谈彼短,靡持己长。做一个谦逊爱学的人!

    本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。鉴于博主处于考研复习期间,有什么问题请在评论区中提出,博主尽可能当天回复,加微信好友请注明原因

  • 相关阅读:
    js代码编写规范
    mysql数据库的水平拆分与垂直拆分
    git使用WebHook实现自动构建
    解决php
    laravel为模型中所有查询统一添加WHERE条件
    centos7+ 安装 php7.2
    nginx配置https
    git常用命令
    php如何应对秒杀抢购高并发思路
    nginx配置优化+负载均衡+动静分离详解
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/14756413.html
Copyright © 2011-2022 走看看