iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python3爬虫-通过selenium
  • 334
分享到

python3爬虫-通过selenium

爬虫selenium 2023-01-31 00:01:34 334人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

from selenium import WEBdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.c

from selenium import WEBdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ActionChains
import time
import JSON
import os

LG_URL_Login = "https://passport.laGou.com/login/login.html"
cookies_path = "./cookies.json"


class MyException(Exception):
    def __init__(self, status, msg):
        self.status = status
        self.msg = msg


class LaGou:
    def __init__(self):
        self.login_status = False
        self.browser = None
        self.__init_browser()

    def __init_browser(self):
        '''初始化浏览器配置'''
        options = Options()
        options.add_experimental_option('excludeSwitches', ['enable-automation'])
        options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
        self.browser = webdriver.Chrome(options=options)
        self.browser.maximize_window()
        self.browser.implicitly_wait(3)
        self.wait = WebDriverWait(self.browser, 10)
        self.ac = ActionChains(self.browser)
        self.browser.get(LG_URL_Login)

    def __choose_login_mode(self):
        '''通过用户名,密码去登陆'''
        # 虽然默认是用户名密码登陆去,确保无误,还是自己点击一下
        self.wait.until(EC.presence_of_element_located((By.XPATH, "//*[@data-lg-tj-id='1Us0']")))
        self.browser.find_element_by_xpath("//*[@data-lg-tj-id='1Us0']").click()

    def __input_user_pwd(self, username, passWord):
        self.wait.until(EC.presence_of_element_located((By.XPATH, '//input[@placeholder="请输入密码"]')))
        self.wait.until(EC.presence_of_element_located((By.XPATH, '//input[@placeholder="请输入常用手机号/邮箱"]')))
        if not username:
            username = input("请输入常用手机号/邮箱>>:").strip()
        if not password:
            password = input("请输入密码>>:").strip()
        phone_ele = self.browser.find_element_by_xpath('//input[@placeholder="请输入常用手机号/邮箱"]')
        pwd_ele = self.browser.find_element_by_xpath('//input[@placeholder="请输入密码"]')
        # 输入账号
        phone_ele.clear()
        phone_ele.send_keys(username)
        # 输入密码
        pwd_ele.clear()
        pwd_ele.send_keys(password)

    def __chick_submit(self):
        self.wait.until(EC.presence_of_element_located((By.XPATH, "//*[@data-lg-tj-id='1j90']")))
        self.browser.find_element_by_xpath("//*[@data-lg-tj-id='1j90']").click()

    def __judge_login_successful(self):
        '''判断是否登陆成功'''
        # 判断class属性 user_dropdown
        try:
            self.browser.find_element_by_xpath("//*[@class='user_dropdown']")
            return True
        except NoSuchElementException:
            return False

    def __pull_down_page(self):
        '''首先拉钩它是没有懒加载的,所以我们只需要下拉一次就好了,所以while循环可以注释掉'''
        height = self.browser.execute_script("return document.body.scrollHeight;")
        js = "window.scrollTo(0, {});".fORMat(height)
        self.browser.execute_script(js)
        return self.browser.page_source
        # while True:
        #     now_height = self.browser.execute_script("return document.body.scrollHeight;")
        #     if height == now_height:
        #         return self.browser.page_source
        #     js = "window.scrollTo({}, {});".format(height, now_height)
        #     self.browser.execute_script(js)
        #     height = now_height

    def __judge_ele_exist_by_xpath(self, xpath):
        '''通过xpath,判断是否存在这个元素'''
        try:
            self.browser.find_element_by_xpath(xpath)
            return True
        except NoSuchElementException:
            return False

    def __click_next_page(self):
        '''点击下一页'''
        self.wait.until(EC.presence_of_element_located((By.XPATH, "//span[@class='pager_next ']")))
        self.browser.find_element_by_xpath("//span[@class='pager_next ']").click()

    def __search_job(self, job_name):
        '''输入查询的job信息'''

        # 首先在搜索职位之前呢,会弹回一个框框,默认选择全国站,
        # 之所以会有这个框框,那是因为你不是在登陆状态下访问这个url,如果是登陆的,那么不会出现
        try:
            self.browser.find_element_by_link_text("全国站").click()
        except NoSuchElementException:
            pass

        # 搜索职位
        try:
            # self.wait.until(EC.presence_of_element_located((By.XPATH, "//*[@id='search_input']")))
            search_ele = self.browser.find_element_by_xpath("//*[@id='search_input']")
        except NoSuchElementException:
            search_ele = self.browser.find_element_by_xpath("//*[@id='keyword']")
        search_ele.click()
        search_ele.clear()
        search_ele.send_keys(job_name, Keys.ENTER)

    def __del__(self):
        # 10秒之后,关闭一些资源
        self.browser.close()

    def login(self, username: str = None, password: str = None, load_cookies: bool = True):

        if load_cookies and os.path.exists(cookies_path):
            # 使用保存再文件中的cookies去访问页面
            with open(cookies_path, "r", encoding="utf-8") as f:
                cookies = json.loads(f.read())

            # 将cookies添加进去
            for cookie in cookies:
                self.browser.add_cookie(cookie)

            # 访问登陆页面,如果是登陆页面表示cookie失效了,cookies没有的失效的情况就是重定向到首页
            self.browser.get(LG_URL_Login)
            if self.__judge_login_successful():
                print("登陆成功....")
                return True
            else:
                print("cookies已经失效....")
                # 删除刚刚添加的cookies
                self.browser.delete_all_cookies()
        self.browser.refresh()
        self.__choose_login_mode()
        self.__input_user_pwd(username, password)
        self.__chick_submit()

        # 判断是否有极验验证码
        # 如果你多试几次,你会发现某次登陆不需要滑动验证码,所以说我们就利用这个,虽然并没有完全解决破解,但是目的最终还是达到了
        while True:
            time.sleep(1)
            if self.__judge_ele_exist_by_xpath("//div[@class='geetest_panel_box geetest_panelshowslide']"):
                self.browser.find_element_by_xpath("//a[@class='geetest_close']").click()
                time.sleep(1)
                self.browser.find_element_by_xpath("//*[@data-lg-tj-id='1j90']").click()
                continue
            else:
                break

        if self.__judge_login_successful():
            self.login_status = True
            # 登陆成功,将cookies保存起来
            with open("./cookies.json", "w", encoding="utf-8") as f:
                f.write(json.dumps(self.browser.get_cookies()))
            print("登陆成功")
            return True
        else:
            print("登陆失败,请检查你的用户名或密码")
            return False

    def get_job_info(self, job_name: str = None, is_filter: bool = False):
        '''用于获取到查询的job'''
        if not self.login_status:
            self.browser.get("Https://www.lagou.com/")
        if not job_name:
            job_name = input("请输入查询job的名称>>:").strip()

        self.__search_job(job_name)

        if is_filter:
            # 过滤这个功能不忙实现
            pass
        # 这里开始就是进行翻页操作了,以及对数据的处理
        page = 1
        while True:
            print("爬取工作职位为>>{}   第{}页数据".format(job_name, page))
            # 获取到完毕的页面源码,然后进行提取信息的操作
            page_source = self.__pull_down_page()
            print(page_source)
            # 信息提取完毕,进行翻页操纵
            if not self.__judge_ele_exist_by_xpath("//span[@class='pager_next ']"):
                print("{} 工作职位爬取完毕...".format(job_name))
                break
            self.__click_next_page()
            time.sleep(2)

            # 点击完毕下一页,可能遇到一些反扒措施
            if self.browser.current_url == "https://passport.lagou.com/login/login.html":
                self.login()

            page += 1


if __name__ == '__main__':
    lagou = LaGou()

    username = ""
    password = ""
    lagou.login()

 

保存的cookies只能适用于本次浏览器访问,你关闭浏览器后,再使用cookies登陆,会显示失效。

但我手动登陆拉钩,关闭浏览器。再次访问还是能够访问到我自己的信息。cookies是没有失效的,那估计就是我设置cookies那里有问题吧。

--结束END--

本文标题: python3爬虫-通过selenium

本文链接: https://www.lsjlt.com/news/182089.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python3爬虫-通过selenium
    from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.c...
    99+
    2023-01-31
    爬虫 selenium
  • python3爬虫-通过requests
    import requests from fake_useragent import UserAgent from lxml import etree from urllib.parse import urljoin import py...
    99+
    2023-01-31
    爬虫 requests
  • Selenium爬虫
    第01节 Selenium 1. Selenium概述 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器。 因为Selenium可以控制浏览器发...
    99+
    2023-09-18
    python chrome 爬虫
  • 通过Python3+selenium自动
    使用的是selenium,最开始接触这个模块包是爬虫,这次是工作需要来自动测试网页。 记录一下模拟不同浏览器的方式 总共测了两个浏览器,Firefox在centos7上和chrome在win10上。都是模拟的IPAD方式访问,原因是使用...
    99+
    2023-01-31
    selenium
  • Python3爬虫利器:Selenium怎么安装
    小编给大家分享一下Python3爬虫利器:Selenium怎么安装,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多大型网站均为Py...
    99+
    2023-06-14
  • 【Python3爬虫】拉勾网爬虫
    一、思路分析:在之前写拉勾网的爬虫的时候,总是得到下面这个结果(真是头疼),当你看到下面这个结果的时候,也就意味着被反爬了,因为一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正...
    99+
    2023-01-31
    爬虫 拉勾网
  • Python3 爬虫 requests
    刚学Python爬虫不久,迫不及待的找了一个网站练手,新笔趣阁:一个小说网站。 安装Python以及必要的模块(requests,bs4),不了解requests和bs4的同学可以去官网看个大概之后再回来看教程 刚开始写爬虫的小白都有...
    99+
    2023-01-31
    爬虫 requests
  • 08 Python爬虫之selenium
    ---恢复内容开始--- 一. 先介绍图片懒加载技术   当获取一个网站的图片数据时,只能爬取到图片的名称,并不能获得链接,而且也不能获得xpath表达式。这是应用了图片懒加载技术。   - 图片懒加载技术的概念:     -- 图片懒加...
    99+
    2023-01-31
    爬虫 Python selenium
  • Python 爬虫利器 Selenium
    前面几节,我们学习了用 requests 构造页面请求来爬取静态网页中的信息以及通过 requests 构造 Ajax 请求直接获取返回的 JSON 信息。 还记得前几节,我们在构造请求时会给请求加上浏览器 headers,目的就是为了让...
    99+
    2023-01-30
    爬虫 利器 Python
  • Python3网络爬虫实战-10、爬虫框
    我们直接用 Requests、Selenium 等库写爬虫,如果爬取量不是太大,速度要求不高,是完全可以满足需求的。但是写多了会发现其内部许多代码和组件是可以复用的,如果我们把这些组件抽离出来,将各个功能模块化,就慢慢会形成一个框架雏形,久...
    99+
    2023-01-31
    爬虫 实战 网络
  • Python3网络爬虫实战-11、爬虫框
    ScrapySplash 是一个 Scrapy 中支持 JavaScript 渲染的工具,本节来介绍一下它的安装方式。ScrapySplash 的安装分为两部分,一个是是 Splash 服务的安装,安装方式是通过 Docker,安装之后会...
    99+
    2023-01-31
    爬虫 实战 网络
  • Python3网络爬虫实战-15、爬虫基
    在写爬虫之前,还是需要了解一些爬虫的基础知识,如 HTTP 原理、网页的基础知识、爬虫的基本原理、Cookies 基本原理等。 那么本章内容就对一些在做爬虫之前所需要的基础知识做一些简单的总结。 在本节我们会详细了解 HTTP 的基本原理...
    99+
    2023-01-31
    爬虫 实战 网络
  • python爬虫之selenium模块
    目录一、什么是Selenium二、selenium安装1、PhantomJS: 无可视化界面的浏览器(无头浏览器)2、下载浏览器驱动三、selenium基本使用1、声明浏览器对象He...
    99+
    2024-04-02
  • Python-Selenium自动化爬虫
    目录1.安装2.下载浏览器驱动3.实例3.1下载对应版本的浏览器驱动3.2测试code,打开一个网页,并获取网页的标题3.3一个小样例3.4自动输入并跳转4.开启无头模式5.保存页面...
    99+
    2024-04-02
  • Python3网络爬虫(十一):爬虫黑科
    原文链接: Jack-Cui,http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 1 前言 近期,有些朋友问我一些关...
    99+
    2023-01-31
    爬虫 网络
  • Python3网络爬虫实战-17、爬虫基
    爬虫,即网络爬虫,我们可以把互联网就比作一张大网,而爬虫便是在网上爬行的蜘蛛,我们可以把网的节点比做一个个网页,爬虫爬到这就相当于访问了该页面获取了其信息,节点间的连线可以比做网页与网页之间的链接关系,这样蜘蛛通过一个节点后可以顺着节点连线...
    99+
    2023-01-31
    爬虫 实战 网络
  • 【Python3爬虫】常见反爬虫措施及解
    这一篇博客,是关于反反爬虫的,我会分享一些我遇到的反爬虫的措施,并且会分享我自己的解决办法。如果能对你有什么帮助的话,麻烦点一下推荐啦。   UserAgent中文名为用户代理,它使得服务器能够识别客户使用的操作系统及版本、CPU 类...
    99+
    2023-01-30
    爬虫 措施 常见
  • Python3 爬虫 scrapy框架
    上次用requests写的爬虫速度很感人,今天打算用scrapy框架来实现,看看速度如何。 第一步,安装scrapy,执行一下命令 pip install Scrapy 第二步,创建项目,执行一下命令 scrapy startproje...
    99+
    2023-01-31
    爬虫 框架 scrapy
  • python3爬虫之开篇
    写在前面的话:   折腾爬虫也有一段时间了,从一开始的懵懵懂懂,到现在的有一定基础,对于这一路的跌跌撞撞,个人觉得应该留下一些文字性的东西,毕竟好记性不如烂笔头,而且毕竟这是吃饭的家伙,必须用心对待才可以,从今天起,我将会把关于爬虫的东西...
    99+
    2023-01-30
    爬虫 开篇
  • web自动化爬虫selenium ce
    基本环境:centos7,python3.x 1.安装selenium pip3 install selenium 2.安装chrome-browser wget https://dl.google.com/linux/d... --no...
    99+
    2023-01-31
    爬虫 web ce
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作