精华内容
下载资源
问答
  • 自动化爬虫selenium之操控浏览器
    千次阅读
    2022-02-01 17:16:05

    本文主要讲解操控浏览器的语句,其他教程请点击这里

    在这里插入图片描述

    1、保存页面快照为图片(也就是截图)

    driver.save_screenshot("imagename.png")
    

    2、从浏览器的地址栏读取当前的 URL

    driver.current_url
    

    3、后退

    driver.back()
    

    4、前进

    driver.forward()
    

    5、刷新

    driver.refresh()
    

    6、获取页面的cookies

    driver.get_cookies()
    

    7、关闭标签页或窗口

    driver.close()
    

    8、切回到之前的标签页或窗口

    driver.switch_to.window(original_window)
    

    9、退出浏览器

    driver.quit()
    

    退出浏览器将会:

    • 关闭所有与 WebDriver 会话相关的窗口和选项卡
    • 结束浏览器进程
    • 结束后台驱动进程

    如果不需要一直保持webdriver,可以使用:

    try:
    	#WebDriver 代码…
    finally:
    	driver.quit()
    
    关于selenium,未完,敬请期待!
    更多相关内容
  • Selenium (WEB自动化工具/爬虫):本文包含WEB自动化,以及爬虫使用方法 本文详细介绍了Selenium Python版本的自动化测试方法和实践,通过本文学习你将掌握如下内容:Selenium 测试环境搭建单元测试、生成测试报告...
  • Python之Selenium自动化爬虫

    千次阅读 2022-01-20 23:03:55
    文章目录Python之Selenium自动化爬虫0.介绍1.安装2.下载浏览器驱动3.实例4.开启无头模式5.保存页面截图6.模拟输入和点击a.根据文本值查找节点b.获取当前节点的文本c.打印当前网页的一些信息d.关闭浏览器e.模拟鼠标...

    Python之Selenium自动化爬虫

    0.介绍

    Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器(2018年开发者说暂停开发,chromedriver也可以实现同样的功能)),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。

    1.安装

    pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    2.下载浏览器驱动

    这里用的谷歌浏览器

    http://npm.taobao.org/mirrors/chromedriver/

    查看自己的浏览器版本下载对应的驱动。

    在这里插入图片描述

    把解压后的驱动放在自己的python.exe 目录下。

    3.实例

    我之前写过3个实例

    https://harris.blog.csdn.net/article/details/116406200

    4.开启无头模式

    是否开启无头模式(即是否需要界面)

    from selenium.webdriver import Chrome
    from selenium.webdriver.chrome.options import Options
    
    option = Options()  # 实例化option对象
    option.add_argument("--headless")  # 给option对象添加无头参数
    option.headless = True #这种方式也可以
    if __name__ == '__main__':
        web = Chrome(executable_path='D:\PyProject\spider\venv\Scripts\chromedriver.exe',options=option) # 指定驱动位置,否则从python解释器目录下查找.
        web.get("https://baidu.com")
        print(web.title)
    

    5.保存页面截图

    from selenium.webdriver import Chrome
    from selenium.webdriver.chrome.options import Options
    
    option = Options()  # 实例化option对象
    option.add_argument("--headless")  # 给option对象添加无头参数
    
    if __name__ == '__main__':
        web = Chrome()
        web.maximize_window()  # 浏览器窗口最大化
        web.get("https://baidu.com")
        print(web.title)
        web.save_screenshot('baidu.png')  # 保存当前网页的截图  保存到当前文件夹下
        web.close()  # 关闭当前网页
    

    6.模拟输入和点击

    from selenium.webdriver import Chrome
    from selenium.webdriver.chrome.options import Options
    
    option = Options()  # 实例化option对象
    option.add_argument("--headless")  # 给option对象添加无头参数
    
    if __name__ == '__main__':
        web = Chrome()
        web.maximize_window()  # 浏览器窗口最大化
        web.get("https://baidu.com")
        el = web.find_element_by_id('kw')
        el.send_keys('Harris-H')
        btn = web.find_element_by_id('su')
        btn.click()
        # web.close()  # 关闭当前网页
    

    貌似现在百度可以识别出selenium,还需要图片验证。

    a.根据文本值查找节点

    # 找到文本值为百度一下的节点
    driver.find_element_by_link_text("百度一下") 
    # 根据链接包含的文本获取元素列表,模糊匹配
    driver.find_elements_by_partial_link_text("度一下") 
    

    b.获取当前节点的文本

    ele.text # 获取当前节点的文本
    ele.get_attribute("data-click")  # 获取到属性对应的value
    

    c.打印当前网页的一些信息

    print(driver.page_source)  # 打印网页的源码
    print(driver.get_cookies())  # 打印出网页的cookie
    print(driver.current_url)  # 打印出当前网页的url
    

    d.关闭浏览器

    driver.close()  # 关闭当前网页
    driver.quit()  # 直接关闭浏览器
    

    e.模拟鼠标滚动

    from selenium.webdriver import Chrome
    import time
    
    if __name__ == '__main__':
    
        driver = Chrome()
    
        driver.get(
            "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=78000241_12_hao_pg&wd=selenium%20js%E6%BB%91%E5%8A%A8&fenlei=256&rsv_pq=8215ec3a00127601&rsv_t=a763fm%2F7SHtPeSVYKeWnxKwKBisdp%2FBe8pVsIapxTsrlUnas7%2F7Hoo6FnDp6WsslfyiRc3iKxP2s&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=31&rsv_sug1=17&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=9266&rsv_sug4=9770")
        #  1.滚动到网页底部
        js = "document.documentElement.scrollTop=1000"
        # 执行js
        driver.execute_script(js)
        time.sleep(2)
        # 滚动到顶部
        js = "document.documentElement.scrollTop=0"
        driver.execute_script(js)  # 执行js
    
        time.sleep(2)
        driver.close()
    

    7.ChromeOptions

    options = webdriver.ChromeOptions()
    options.add_argument("--proxy-server=http://110.52.235.176:9999") # 添加代理
    options.add_argument("--headless") # 无头模式
    options.add_argument("--lang=en-US") # 网页显示英语
    prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2} # 禁止渲染
    options.add_experimental_option("prefs", prefs)
    driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe",chrome_options=options)
     
    driver.get("http://httpbin.org/ip")
    

    8.验证滑块移动

    """
    目标:滑动验证码
    1.定位按钮
    2.按住滑块
    3.滑动按钮
    """
    import time
    from selenium import webdriver
    
    if __name__ == '__main__':
        chrome_obj = webdriver.Chrome()
        chrome_obj.get('https://www.helloweba.net/demo/2017/unlock/')
    
        # 1.定位滑动按钮
        click_obj = chrome_obj.find_element_by_xpath('//div[@class="bar1 bar"]/div[@class="slide-to-unlock-handle"]')
    
        # 2.按住
        # 创建一个动作链对象,参数就是浏览器对象
        action_obj = webdriver.ActionChains(chrome_obj)
    
        # 点击并且按住,参数就是定位的按钮
        action_obj.click_and_hold(click_obj)
    
        # 得到它的宽高
        size_ = click_obj.size
        width_ = 298 - size_['width']  # 滑框的宽度 减去 滑块的 宽度 就是 向x轴移动的距离(向右)
        print(width_)
        # 3.定位滑动坐标
        action_obj.move_by_offset(298-width_, 0).perform()
    
        # 4.松开滑动
        action_obj.release()
    
        time.sleep(6)
        chrome_obj.quit()
    

    9.打开多窗口和页面切换

    有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到

    from selenium import webdriver
    
    if __name__ == '__main__':
        driver = webdriver.Chrome()
    
        driver.get("https://www.baidu.com/")
        driver.implicitly_wait(2)
        driver.execute_script("window.open('https://www.douban.com/')")
        driver.switch_to.window(driver.window_handles[1])
    
        print(driver.page_source)
    

    第二个实例

    
    if __name__ == '__main__':
        from selenium import webdriver
        import time
    
        driver = webdriver.Chrome()
        start_url = 'https://www.baidu.com'
        start_url_1 = 'https://www.csdn.net'
    
        driver.get(start_url)
        time.sleep(5)
        """通过执行js代码,打开浏览器窗口,访问地址"""
        js = 'window.open("{}")'.format(start_url_1)
        driver.execute_script(js)
        time.sleep(5)
        """获取浏览器所有窗口:注意点:窗口的切换是通过下标控制的"""
        win = driver.window_handles
        # 执行切换
        driver.switch_to.window(win[0])
        time.sleep(2)
        driver.switch_to.window(win[1])
        time.sleep(2)
        driver.switch_to.window(win[0])
        time.sleep(2)
        driver.switch_to.window(win[1])
        # 浏览器窗口的关闭
        driver.close()
        # 退出浏览器
        driver.quit()
    
    

    有时候网页会内嵌另一个html。一般称为iframe

    from selenium import webdriver
    driver = webdriver.Chrome()
    start_url = 'https://mail.163.com/'
    driver.get(start_url)
    """定位不成功,在有的情况是因为有页面的嵌套导致的
    在一个html源码中有多个html页面,示例:一个html嵌套一个html
    以上:又称之为iframe的嵌套
    """
    # 定位嵌套位置iframe
    el_iframe = driver.find_elements_by_tag_name('iframe')
    # 执行iframe的切换
    driver.switch_to.frame(el_iframe[0])
    # 标签定位
    driver.find_element_by_name('email').send_keys('邮箱账号')
    driver.find_element_by_name('password').send_keys('你的邮箱密码')
    driver.find_element_by_id('dologin').click()
    
    

    10.Cookie操作

    # 1.获取所有的cookie:
    for cookie in driver.get_cookies():
        print(cookie)
    # 2.根据cookie的key获取value:
    value = driver.get_cookie(key)
    # 3.删除所有的cookie:
    driver.delete_all_cookies()
    # 4.删除某个cookie:
    driver.delete_cookie(key)
    # 添加cookie:
    driver.add_cookie({"name":"password","value":"111111"})
    

    11.模拟登录

    这里模拟登录我们学校教务处。

    from selenium.webdriver import Chrome
    
    if __name__ == '__main__':
        web = Chrome()
        web.get('http://bkjx.wust.edu.cn/')
        username = web.find_element_by_id('userAccount')
        username.send_keys('xxxxxxx') # 这里填自己的学号
        password = web.find_element_by_id('userPassword')
        password.send_keys('xxxxxxx') # 这里填自己的密码
        btn = web.find_element_by_xpath('//*[@id="ul1"]/li[4]/button')
        btn.click()
        # do something
    
    

    因为没有滑块啥的验证,所以就很简单qwq。然后后面进行自己的操作即可。


    12.使用代理

    from selenium import webdriver
    import time
    
    options = webdriver.ChromeOptions()
    options.add_argument('--proxy-server=http://ip地址')  # 代理IP:端口号
    # ${chromedriver_path}: chromedriver驱动存放路径
    driver = webdriver.Chrome(options=options)
    driver.get("https://dev.kdlapi.com/testproxy")
    
    # 获取页面内容
    print(driver.page_source)
    
    # 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出
    time.sleep(3)
    driver.close()
    
    

    14.更换UA

    from selenium import webdriver
    import time
    
    agent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'
    options = webdriver.ChromeOptions()
    options.add_argument('--user-agent=' + agent)
    # ${chromedriver_path}: chromedriver驱动存放路径
    driver = webdriver.Chrome(options=options)
    driver.get("https://www.baidu.com")
    
    # 获取页面内容
    print(driver.page_source)
    
    # 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出
    time.sleep(3)
    
    
    

    15.鼠标悬停

    if __name__ == '__main__':
        from selenium import webdriver
        from selenium.webdriver.common.action_chains import ActionChains
    
        driver = webdriver.Chrome()
        import time
    
        start_url = 'https://lceda.cn/'
    
        driver.get(start_url)
    
        # 定位到需要悬停的标签
        move = driver.find_element_by_xpath('//*[@id="headerNav"]/li[1]/a/span')
        # //*[@id="headerNav"]/li[1]/a/span
        # 悬停之后需要点击的标签
        a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[1]/div[3]/div[1]/a[2]')
        # //*[@id="headerNav"]/li[1]/div/a[2]
        # /html/body/div[1]/div[2]/div[1]/div[1]/div[1]/div/div/div[1]/ul/li[1]/div/a[2]
        # 悬停点击执行
        # 创建事件对象
        actions = ActionChains(driver)
        time.sleep(1)
        # 记录操作
        actions.move_to_element(move)
        time.sleep(1.5)
        # 悬停的点击
        actions.click(a)
        time.sleep(1)
        # 开始执行事件
        actions.perform()
    
    

    16.优缺点

    selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易。
    selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用。

    展开全文
  • 自动化爬虫selenium基础教程

    千次阅读 2022-01-28 17:31:02
    一、前期准备 二、基础操作 1、实例一个浏览器对象 2、对url发起请求 3、标签定位 4、标签交互 5、点击按钮 6、回退、前进和关闭 7、解析数据 8、执行JavaScript程序 9、实现无可视界面的操作(无头浏览器) 10...

    一、前期准备

    二、基础操作

    1、实例化一个浏览器对象

    2、对url发起请求

    3、标签定位

    4、标签交互

    5、点击按钮

    6、回退、前进和关闭

    7、解析数据

    8、执行JavaScript程序

    9、实现无可视化界面的操作(无头浏览器)

    10、实现规避检测(去除浏览器识别)

    11、iframe的处理

    12、动作链

    13、解决特征识别

    不懂或有疑问等任何问题还请私信或评论


    一、前期准备

    1、在终端进行selenium的安装

    pip install selenium

    2、下载一个浏览器的驱动程序

    这里使用谷歌浏览器,点这下载谷歌浏览器驱动

    注意:需要选择对应自己电脑浏览器的版本。

    3、将下载好的谷歌浏览器驱动程序移动到当前项目下(可不用移动,填写路径)

    二、基础操作

    1、实例化一个浏览器对象

    from selenium import webdriver
    
    # 实例化一个浏览器对象(传入浏览器的驱动程序)
    driver = webdriver.Chrome(executable_path='./chromedriver.exe')

    2、对url发起请求

    # 对url发起请求
    driver.get('URL')

    3、标签定位

    此处以搜索框为例,获取其id,使用find_element_by_id()对其定位。

    # 标签定位
    search_input = driver.find_element_by_id('id')

    如果是class:

    # 标签定位
    search_input = driver.find_element_by_class_name('className')

    4、标签交互

    使用send_keys在搜索框中输入需要搜索的关键字。

    # 标签交互
    search_input.send_keys('CSDN')

    5、点击按钮

    点击搜索按钮,在浏览器中使用开发者工具定位搜索按钮的id,click() 进行点击。

    # 点击搜索按钮
    btn = driver.find_element_by_id('id')
    btn.click()

    6、回退、前进和关闭

    # 回退
    driver.back()
    
    # 前进
    driver.forward()
    
    # 关闭浏览器
    driver.quit()

    7、解析数据

    # 导包
    from selenium import webdriver
    from lxml import etree
    from time import sleep
    
    # 实例化一个浏览器对象(传入浏览器的驱动程序)
    driver = webdriver.Chrome(executable_path='./chromedriver.exe')
    # 发起一个指定url请求
    driver.get('URL')
    
    # 获取浏览器当前页面的页面源码数据
    page_text = driver.page_source
    
    # 解析详细数据
    tree = etree.HTML(page_text)
    li_list = tree.xpath('xpath路径')
    for li in li_list:
        name = li.xpath('以li_list下的xpath路径')[0]
        print(name)
    
    sleep(5)
    driver.quit()

    8、执行JavaScript程序

    这里执行JavaScript程序使得浏览器向下滚动一屏距离。

    # 执行一组JavaScript程序
    driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')

    9、实现无可视化界面的操作(无头浏览器)

    # 实现无可视化界面的操作
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    
    driver = webdriver.Chrome(executable_path='./chromedriver.exe', options=chrome_options)

    10、实现规避检测(去除浏览器识别)

    # 实现规避检测
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    
    driver = webdriver.Chrome(executable_path='./chromedriver.exe', options=option)

    11、iframe的处理

    如果定位的标签存在于iframe标签之中,则须使用switch_to.frame(id),这里的id是iframe标签中的id。

    这个在登录QQ空间时可以用到,想学的可以点这里去学习

     当然,不止是QQ空间又iframe标签,还有很多地方也是有的。

    # 如果定位的标签是存在与iframe标签之中的则必须通过如下操作再进行标签定位
    bro.switch_to.frame('iframeResult')  # 切换浏览器标签定位的作用域
    div = bro.find_element_by_id('draggable')

    12、动作链

    鼠标动作:左键单击按住→拖动→释放

    这就是动作链

    这个可以用在很多登录验证的地方,那些需要滑动验证的,都可以去尝试一下。

    from selenium import webdriver
    from time import sleep
    # 导入动作链对应的类
    from selenium.webdriver import ActionChains
    
    driver = webdriver.Chrome(executable_path='./chromedriver.exe')
    
    driver.get('URL')
    
    # 如果定位的标签是存在与iframe标签之中的则必须通过如下操作再进行标签定位
    driver.switch_to.frame('iframeResult')  # 切换浏览器标签定位的作用域
    div = driver.find_element_by_id('id')
    
    # 动作链
    action = ActionChains(driver)
    # 点击长按指定的标签
    action.click_and_hold(div)
    
    # 这里可以不适用循环,看个人爱好
    for i in range(5):
        # perform()立即执行动作链操作
        # move_by_offset(x, y):x水平方向  y竖直方向
        action.move_by_offset(20, 0).perform()
        sleep(0.5)
    
    # 释放动作链
    action.release()
    
    sleep(2)
    
    driver.quit()

    13、解决特征识别

    这个特征识别在很多地方都可以用得上,特别是12306登录滑块验证的时候,非常nice!

    关于12306如何使用selenium登录可以点这里进行学习

    # 解决特征识别
    script = 'Object.defineProperty(navigator, "webdriver", {get: () => false,});'
    bro.execute_script(script)

    不懂或有疑问等任何问题还请私信或评论

    展开全文
  • 讲解基于Python Selenium 的自动化数据采集,自动化框架设计,SEO搜索收录引擎与接口对接等实战项目
  • 基于Python的可配置自动化爬虫系统的设计与实现
  • Selenium自动化爬虫

    千次阅读 2021-01-27 18:36:34
    Python爬虫入门之 Selenium自动化爬虫 Selenium官方文档 1. Selenium的安装配置 pip install selenium selenium配置 2. 基本请求 from selenium import webdriver # 创建实例 browser = webdriver.Chrome() ...

    Python爬虫入门之 Selenium自动化爬虫

    Selenium官方文档
    在这里插入图片描述

    1. Selenium的安装配置

    pip install selenium
    

    selenium配置

    2. 基本请求

    from selenium import webdriver
    
    # 创建实例 
    browser = webdriver.Chrome()
    browser = webdriver.Firefox()
    browser = webdriver.xxx()
    
    # 浏览器窗口最大化  
    browser.maximize_window() 
    
    # 请求百度首页
    browser.get("https://movie.douban.com/top250") 
    
    # 关闭当前页面
    browser.close()
    # 退出浏览器
    browser.quit()
    

    3. 常用操作

    浏览器方法

    浏览器方法作用
    browser.get(url)请求url
    browser.quit()关闭浏览器
    browser.close()关闭当前页面
    browser.page_source获取源码
    browser.page_source.find(‘keyword’)在源码中查找
    browser.maximize_window() - 浏览器窗口最大化窗口最大化

    节点操作:

    节点操作作用
    node.send_keys(’’)在文本框填写内容
    node.click()点击
    node.get_attribute(‘href/id/name’)获取节点属性
    node.text获取节点文本

    3.1 获取cookie

    browser.get_cookies()
    

    3.2 获取url

    browser.current_url
    

    3.3 获取源码

    browser.page_source
    

    3.4 切换Frame

    Selenium 打开页面后,默认是在父级 Frame 里面操作,如果页面中还有子 Frame,Selenium 是不能获取到子 Frame 里面的节点的。这时就需要使用 switch_to.frame 方法来切换 Frame。

    示例如下:

    • 这个在网易云音乐下载和模拟QQ邮箱登录的案例中会讲到。
    browser.switch_to_frame('id name')
    

    4. 查找节点

    4.1 单个节点

    做一个展示:

    有多种方式,深入的方法可以通过官方文档进行系统的学习。

    # 根据name值查找
    find_element_by_name('sunrisecai')
    # 根据id值查找
    find_element_by_id('sunrisecai')
    # 根据xpath查找
    find_element_by_xpath('sunrisecai')
    # 根据CSS选择器查找
    find_element_by_css_selector('sunrisecai')
    

    等价:

    find_element(),里面填写需要查找的节点即可。

    from selenium.webdriver.common.by import By
    
    # 根据name值查找
    find_element(By.NAME,'sunrisecai')
    # 根据id值查找
    find_element(By.ID,'sunrisecai')
    # 根据xpath查找
    find_element(By.XPATH,'sunrisecai')
    # 根据CSS选择器查找
    find_element(By.CSS_SELECTOR,'sunrisecai')
    

    4.2 多个节点

    单个节点与多个节点的区别如下所示:

    节点区别区别
    单个节点find_elementfind_element_by_xxx
    多个节点find_elementsfind_elements_by_xxx

    可以看到基本上是一致的,不同点在于多个节点的element多了一个s,即elements。

    5. 模拟填写表单、点击等

    填写表单:

    # 首先定位到文本框
    text_box = browser.find_element_by_xpath('xxx')
    
    # 清空文本框
    text_box.clear()
    
    # 输入文字
    text_box.send_keys('xxx')
    

    模拟点击:

    # 点击搜索
    browser.find_element_by_xpath('xxx').click()
    

    5.1 模拟登录Python Tip

    登录Python Tip:http://www.pythontip.com/user/login

    from selenium import webdriver
    
    url = "http://www.pythontip.com/user/login"
    
    # 实例化浏览器
    browser = webdriver.Chrome()
    # 最大化窗口
    browser.maximize_window() 
    # 请求网页
    browser.get(url) 
    
    # 输入账号密码
    browser.find_element_by_xpath('//*[@id="editor_name"]').send_keys('PythonXC')
    browser.find_element_by_xpath('//*[@id="editor_pwd"]').send_keys('pythonxiaocai')
    # 点击登录
    browser.find_element_by_xpath('//*[@id="apLogin"]/fieldset/div[3]/input').click()
    

    6. 执行Js

    页面进度条下拉操作:

    • 京东商城的爬取案例中会用到
    browser.execute_script( 'window.scrollTo(0,document.body.scrollHeight)')
    

    7. 隐式等待 和 显式等待

    在使用Selenium访问网页的过程中,有时候需要等待网页的加载,所以有时候就需要延时等待一定的实践,确保网页里你需要的内容都加载出来。

    7.1 隐式等待

    当使用隐式等待执行测试的时候,如果 Selenium 没有在 DOM 中找到节点,将继续等待,超出设定时间后,则抛出找不到节点的异常。

    这里用 implicitly_wait 方法实现隐式等待。

    示例如下:

    import time
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    class JdSpider(object):
        def __init__(self):
            self.url = 'https://www.jd.com/' 
            self.browser = webdriver.Chrome()
            # 隐式等待
            # self.browser.implicitly_wait(10) 
    
    
        def get_page(self):
            self.browser.get(self.url)
            self.browser.find_element_by_xpath('//*[@id="key"]').send_keys('爬虫书籍')
            self.browser.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click()
       
    		# 常规等待
        	# time.sleep(5)
            next_button = self.browser.find_element_by_class_name('pn-next')
            next_button.click()
            
        def main(self):
            self.get_page()
    
    
    spider= JdSpider()
    spider.main()
    

    7.2 显式等待

    指定要查找的节点,再指定一个最长等待时间。如果在指定时间内加载出来了这个节点,就返回查找的节点;如果到了指定时间没有加载出该节点,则抛出超时异常。

    示例如下:

    import time
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    class JdSpider(object):
        def __init__(self):
            self.url = 'https://www.jd.com/' 
            self.browser = webdriver.Chrome()
            self.wait = WebDriverWait(self.browser,10)
            # 隐式等待
            # self.browser.implicitly_wait(10) 
    
    
        def get_page(self):
            self.browser.get(self.url)
            self.browser.find_element_by_xpath('//*[@id="key"]').send_keys('爬虫书籍')
            self.browser.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click()
            
            # 常规等待
            # time.sleep(5)
            # next_button = self.browser.find_element_by_class_name('pn-next')
            # next_button.click()
            
            # 显式等待
            next_button=self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,'pn-next')))
            next_button.click()
    
        def main(self):
            self.get_page()
    
    
    spider= JdSpider()
    spider.main()
    

    8. 防止Selenium被屏蔽

    from selenium import webdriver
    from selenium.webdriver import ChromeOptions
    
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    browser = webdriver.Chrome(options=option)
    # 关闭自动化扩展信息
    option.add_experimental_option('useAutomationExtension',False)
    
    browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',{'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefined})'})
    browser.get('https://antispider1.scrape.cuiqingcai.com/')
    

    Boss直聘案例展示:

    from selenium import webdriver
    from selenium.webdriver import ChromeOptions
    
    
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    browser = webdriver.Chrome(options=option)
    
    # 关闭自动化扩展信息
    # option.add_experimental_option('useAutomationExtension',False)
    
    # browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',{'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefined})'})
    
    url = 'https://www.zhipin.com/'
    browser.get(url)
    
    
    # 输入职位
    browser.find_element_by_xpath('//*[@id="wrap"]/div[4]/div/div/div[1]/form/div[2]/p/input').send_keys('Python')
    # 点击搜索
    browser.find_element_by_xpath('//*[@id="wrap"]/div[4]/div/div/div[1]/form/button').click()
    

    9. 无头模式

    如果你觉得每次运行代码弹出来的浏览器窗口太烦人,那么不妨试一下Selenium的无头模式,即不会弹出浏览器窗口。

    from selenium import webdriver
    from selenium.webdriver import ChromeOptions
    
    option = ChromeOptions()
    option.add_argument('--headless')
    browser = webdriver.Chrome(options=option)
    
    url = 'https://www.baidu.com'
    browser.get(url)
    browser.save_screenshot('baidu.png')
    

    10. 案例讲解

    10.1 模拟豆瓣登录

    • QQ邮箱登录的操作是一致的。
    from selenium import webdriver
    
    url = 'https://www.douban.com/'
    browser = webdriver.Chrome()
    browser.get(url)
    
    # 切换到frame
    frame_node = browser.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe')
    browser.switch_to.frame(frame_node)
    
    # 选择密码登录
    browser.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()
    # 输入账号密码
    browser.find_element_by_xpath('//*[@id="username"]').send_keys('18306658370')
    browser.find_element_by_xpath('//*[@id="password"]').send_keys('db@1234')
    # 点击登录
    browser.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[5]/a').click()
    

    10.2 网易云音乐下载

    搜索链接:

    search_url = 'https://music.163.com/#/search/m/?s={}'
    

    网易云音乐API:

    api_url = 'http://music.163.com/song/media/outer/url?id={}'
    

    10.2.1 下载音乐

    import requests
    resp = requests.get(url,headers=headers)
    with open('xxx.mp3','wb') as f:
        f.write(resp.content)
    

    10.2.2 获取歌曲ID

    1. 获取源码,歌曲的ID在源码里边
    2. 从源码中提取歌曲id歌曲名称歌手
    import re
    
    # 切换到g_iframe页面
    browser.switch_to_frame("g_iframe")
    html = browser.page_source
    
    # 正则提取歌曲信息
    song_id = re.findall('a href="/song\?id=(.*?)"', html)
    song_name = re.findall(('<b title="(.*?)"'), html)
    singer = re.findall('span class="s-fc7">(.*?)</span>', html)
    
    for id, name, singer in zip(song_id, song_name, singer):
        print(id,name,singer)
    

    往期回顾

    1. 冰冰B站视频弹幕爬取原理解析
    2. Python建立时间序列ARIMA模型实战案例
    3. 使用xpath爬取数据
    4. jupyter notebook使用
    5. BeautifulSoup爬取豆瓣电影Top250
    6. 一篇文章带你掌握requests模块
    7. Python网络爬虫基础–BeautifulSoup

    到这里就结束了,如果对你有帮助,欢迎点赞关注评论,你的点赞对我很重要

    展开全文
  • 爬虫 + 自动化利器 selenium 之自学成才篇(一)

    千次阅读 多人点赞 2021-09-23 12:23:18
    浏览器前进&后退 浏览器刷新 浏览器窗口切换 常见操作 鼠标控制 单击左键 单击右键 双击 拖动 鼠标悬停 键盘控制 ❤ 系列内容 ❤ 爬虫+自动化利器 selenium 之自学成才篇(一) 主要内容:selenium 简介、selenium ...
  • 通常以前用Python,都只是在ArcGIS中处理一些空间分析和地图操作的自动化任务,这回头一次写爬虫,也算是做过的一个比较完整的新型项目,编码耗时1个多月,维护耗时5个月,目前稳定在5.1版本,做过几次较大的更新,...
  • 自动化爬虫爬取腾讯招聘信息

    千次阅读 2021-11-13 21:39:47
    输入页数开始爬取 可设定是否无头浏览 有一个坑就是在翻页时无法直接click该元素 要写一个执行js 预览图: 上代码 import time from selenium import webdriver from selenium.webdriver.... self.url = "htt.
  • 可视化自动抓取软件不用编程自动化抓取爬虫hawk5.2Hawk的含义为“鹰”,能够高效,准确地捕杀猎物。它的思想来源于Lisp语言,功能模仿了Linux工具awk。 特点如下: 智能分析网页内容,无需编程 所见即所得,可视化...
  • 文章目录一、开发者模式二、测试连通性三、查找包名四、抓取app包的数据请求1,抓取socket请求:2.... 一、开发者模式 ...二、测试连通性 输入adb devices查看刚刚连接的设备 三、查找包名 输入adb shell 进入刚刚连接的...
  • 网络爬虫自动化

    2018-04-11 20:27:47
    详细介绍了网络爬虫自动化的相关内容,方便初学者系统学习和掌握相关的知识技能
  • 分为真机/模拟器和云手机两种情况*真机/模拟器自动化部分*1.使用自动化框架驱动自动化实现自动化(appium,airtest),也...使用adb实现简单的手机自动化*真机/模拟器自动化爬虫部分*1.使用1中自动化框架驱动手机自...
  • 爬虫爬取二、爬虫所需要的库:1. urllib 标准库,无需安装,直接 import 使用2. requests 库,需要安装3. selenium 库,需要安装4. phantomJS ,官网下载5. re #正则,标准库,不需要安装6. BeautifulSoup,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,288
精华内容 32,115
关键字:

自动化爬虫

友情链接: fie.zip