• 小爬爬4:selenium操作


    1.selenium是什么?

    selenium:
        - 概念:是一个基于浏览器自动化的模块。
        - 和爬虫之间的关联?
            - 帮我我们便捷的爬取到页面中动态加载出来的数据
            - 实现模拟登陆
    - 基本使用流程: - pip install selenium - 下载对应的驱动程序:http://chromedriver.storage.googleapis.com/index.html - 实例化一个浏览器对象(将浏览器的驱动程序加载到该对象中)     查看驱动和浏览器版本的映射关系:
      • http://blog.csdn.net/huilan_same/article/details/51896672
    - 无头浏览器:
            - phantomJs    #一般不用这个
            - 谷歌无头      重头戏在这个地方
    
        - 如何规避网站对selenium监测的风险

    (1)演示程序

    前戏:加载驱动程序(下载),下载之前先看一下对应关系

    A.选择右上角的三个点

    B.选择"帮助",===>3.关于google chrome得到的结果,版本是73,因此我们需要下载驱动v2.46

     

    下载第三个

    这个可能需要"蓝灯"进行安装

    将下载解压后的文件,放在同级目录下边,

     

    这个时候,我们再次运行同级目录下的文件,就可以实现一个自动化操作了

    from selenium import webdriver
    from time import sleep
    
    # 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的
    driver = webdriver.Chrome(r'./chromedriver.exe')
    # 用get打开百度页面
    driver.get("http://www.baidu.com")
    # 查找页面的“设置”选项,并进行点击
    driver.find_elements_by_link_text('设置')[0].click()
    sleep(2)
    # # 打开设置后找到“搜索设置”选项,设置为每页显示50条
    driver.find_elements_by_link_text('搜索设置')[0].click()
    sleep(2)
    
    # 选中每页显示50条
    m = driver.find_element_by_id('nr')
    sleep(2)
    m.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
    m.find_element_by_xpath('.//option[3]').click()
    sleep(2)
    
    # 点击保存设置
    driver.find_elements_by_class_name("prefpanelgo")[0].click()
    sleep(2)
    
    # 处理弹出的警告页面   确定accept() 和 取消dismiss()
    driver.switch_to_alert().accept()
    sleep(2)
    # 找到百度的输入框,并输入 美女
    driver.find_element_by_id('kw').send_keys('美女')
    sleep(2)
    # 点击搜索按钮
    driver.find_element_by_id('su').click()
    sleep(2)
    # 在打开的页面中找到“Selenium - 开源中国社区”,并打开这个页面
    driver.find_elements_by_link_text('美女_百度图片')[0].click()
    sleep(3)
    
    # 关闭浏览器
    driver.quit()

     2.

     pip install lxml

    from selenium import webdriver
    from lxml import etree                                  #这个地方报红没有问题
    import time
    bro = webdriver.Chrome(executable_path='./chromedriver.exe') #打开一个空白页
    #让浏览器对指定url发起访问
    bro.get('http://125.35.6.84:81/xk/')                        #访问药监总局的网站
    
    #获取浏览器当前打开页面的页面源码数据(可见即可得)
    page_text = bro.page_source
    
    time.sleep(2)
    tree = etree.HTML(page_text)
    name = tree.xpath('//*[@id="gzlist"]/li[1]/dl/a/text()')[0]  # 获取第一个名字
    print(name)
    time.sleep(3)
    bro.quit()

    得到结果:爬取第一条数据

    广州市科馨生物科技有限公司

    3.selenium相关的行为动作制定

    from selenium import webdriver
    import time
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    
    bro.get('https://www.taobao.com')
    
    #(1)节点定位 find系列的方法,定位到标签或者节点
    input_text = bro.find_element_by_id('q')
    #(2)节点交互
    input_text.send_keys('苹果')
    time.sleep(2)
    
    #(3)执行js程序(js注入)    #滚轮的拖动1屏幕的高度
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    
    #(4)点击搜索按钮事件
    btn = bro.find_element_by_css_selector('.btn-search')
    btn.click()
    
    time.sleep(3)
    bro.quit()

    4.动作链

    from selenium import webdriver
    #导入动作链对应的模块,具体用到再查看
    from selenium.webdriver import ActionChains
    import time
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    
    bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    #如果定位的节点是被包含在iframes节点之中的,则必须使用switch_to进行frame的切换
    bro.switch_to.frame('iframeResult')
    
    #通过id进行定位
    div_tag = bro.find_element_by_id('draggable')
    
    #实例化一个动作链对象(需要将浏览器对象作为参数传递给该对象的构造方法)
    action = ActionChains(bro)
    #单击且长按
    action.click_and_hold(div_tag)
    
    for i in range(5):
        #让div向右移动,移动偏移
        action.move_by_offset(17,0).perform()
        #perform()立即执行动作链
        time.sleep(0.5)
    
    time.sleep(2)
    bro.quit()

    5.谷歌无头浏览器

    from selenium import webdriver
    from lxml import etree
    import time
    
    from selenium.webdriver.chrome.options import Options
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    
    bro = webdriver.Chrome(executable_path='./chromedriver.exe',chrome_options=chrome_options)
    #让浏览器对指定url发起访问
    bro.get('http://125.35.6.84:81/xk/')
    
    #获取浏览器当前打开页面的页面源码数据(可见即可得)
    page_text = bro.page_source
    time.sleep(2)
    tree = etree.HTML(page_text)
    name = tree.xpath('//*[@id="gzlist"]/li[1]/dl/a/text()')[0]
    print(name)
    time.sleep(3)
    bro.quit()

    示例结果:

    广州市科馨生物科技有限公司

    6.如何规避网站对selenium检测的风险?

    from selenium import webdriver
    from lxml import etree
    import time
    
    from selenium.webdriver import ChromeOptions
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    
    bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=option)
    #让浏览器对指定url发起访问
    bro.get('http://125.35.6.84:81/xk/')
    
    #获取浏览器当前打开页面的页面源码数据(可见即可得)
    page_text = bro.page_source
    time.sleep(2)
    tree = etree.HTML(page_text)
    name = tree.xpath('//*[@id="gzlist"]/li[1]/dl/a/text()')[0]
    print(name)
    time.sleep(5)
    bro.quit()

    代码启动,不要轻易再动鼠标

    7.qq空间模拟登陆

    # Author: studybrother sun
    import requests
    from selenium import webdriver
    from lxml import etree
    import time
    
    driver = webdriver.Chrome(executable_path='./chromedriver.exe')
    driver.get('https://qzone.qq.com/')
    # 在web 应用中经常会遇到frame 嵌套页面的应用,使用WebDriver 每次只能在一个页面上识别元素,对于frame 嵌套内的页面上的元素,直接定位是定位是定位不到的。这个时候就需要通过switch_to_frame()方法将当前定位的主体切换了frame 里。
    driver.switch_to.frame('login_frame')
    driver.find_element_by_id('switcher_plogin').click()
    
    # driver.find_element_by_id('u').clear()
    driver.find_element_by_id('u').send_keys('*******')  # 这里填写你的QQ号
    # driver.find_element_by_id('p').clear()
    driver.find_element_by_id('p').send_keys('********')  # 这里填写你的QQ密码
    
    driver.find_element_by_id('login_button').click()
    time.sleep(2)
    # driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    # time.sleep(2)
    # driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    # time.sleep(2)
    # driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    # time.sleep(2)
    # page_text = driver.page_source
    #
    # tree = etree.HTML(page_text)
    # # 执行解析操作
    # li_list = tree.xpath('//ul[@id="feed_friend_list"]/li')
    # for li in li_list:
    #     text_list = li.xpath('.//div[@class="f-info"]//text()|.//div[@class="f-info qz_info_cut"]//text()')
    #     text = ''.join(text_list)
    #     print(text + '
    
    
    ')
    
    driver.close()
  • 相关阅读:
    python处理excel文件
    Python datetime模块
    OrderedDict 有序字典以及读取json串时如何保持原有顺序
    ansible 学习笔记
    nginx的location和rewrite
    实体机重装系统
    热词
    教育
    生活
    1、两数之和
  • 原文地址:https://www.cnblogs.com/studybrother/p/10952348.html
Copyright © 2020-2023  润新知