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那里有问题吧。

python3爬虫-通过selenium登陆拉钩,爬取职位信息的更多相关文章

  1. 利用python3 爬虫 定制版妹子图mzitu爬取

    在刚开始学爬虫的时候,用来练手的基础爬虫就是爬取各种妹子图片,前几天同时说了这个,便准备随便写一个...最后发现真是三天不练..什么都记不住了!!所以花了政治一天重新写了一个爬虫程序,并且支持按照时间 ...

  2. 【Python3 爬虫】06_robots.txt查看网站爬取限制情况

    大多数网站都会定义robots.txt文件来限制爬虫爬去信息,我们在爬去网站之前可以使用robots.txt来查看的相关限制信息 例如: 我们以[CSDN博客]的限制信息为例子 在浏览器输入:http ...

  3. python3爬虫-通过requests获取拉钩职位信息

    import requests, json, time, tablib def send_ajax_request(data: dict): try: ajax_response = session. ...

  4. 爬虫之Selenium 动态渲染页面爬取

    Selenim 是一个自动化测试工具,可以利用它驱动浏览器执行特定的动作,如点击.下拉等操作,同时可以获取浏览器当前呈现的页面的源代码,做到可见及可爬 1.使用流程 1)声明浏览器对象 Seleniu ...

  5. selenium 模拟登陆豆瓣,爬取武林外传的短评

    selenium 模拟登陆豆瓣,爬去武林外传的短评: 在最开始写爬虫的时候,抓取豆瓣评论,我们从F12里面是可以直接发现接口的,但是最近豆瓣更新,数据是JS异步加载的,所以没有找到合适的方法爬去,于是 ...

  6. Python爬虫之selenium爬虫,模拟浏览器爬取天猫信息

    由于工作需要,需要提取到天猫400个指定商品页面中指定的信息,于是有了这个爬虫.这是一个使用 selenium 爬取天猫商品信息的爬虫,虽然功能单一,但是也算是 selenium 爬虫的基本用法了. ...

  7. 使用selenium+phantomJS实现网页爬取

    有些网站反爬虫技术设计的非常好,很难采用WebClient等技术进行网页信息爬取,这时可以考虑采用selenium+phantomJS模拟浏览器(其实是真实的浏览器)的方式进行信息爬取.之前一直使用的 ...

  8. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  9. 爬虫系列4:Requests+Xpath 爬取动态数据

    爬虫系列4:Requests+Xpath 爬取动态数据 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参 ...

随机推荐

  1. Oracle如何把数据库表迁移到指定表空间

     问题描述: 将测试数据库中的表结果导入到正式数据库.需要在正式库中建立独立的表空间存放新导入的表,以避免和正式库中原来的表混淆. 处理步骤: 1. 在命令行中用exp指令导出测试库中指定表到指定 ...

  2. js异步原理与 Promise

    一.Javascript的异步原理 javascript 是单线程语言,所以同一时间只执行一个运算.但有些方法是不能瞬间完成或不可预知何时完成的(如网络请求.settimeout等),为了让它们不对后 ...

  3. oracle 删除表的几种方法及回收站

    1.删除表结构和表数据 drop table 表名 [purge]  purge表示不放入回收站 2.删除表数据 delete from 表名 [where ...] 特点:高水位线不降:记录日志,速 ...

  4. oracle lz047中的REGEXP_LIKE(cust_first_name,'[[:digit:]]')) .

    转自http://blog.csdn.net/dream19881003/article/details/6680982 今天在看OCP题库的时候有一道题是考字段约束的,意思是要在表CUSTOMERS ...

  5. 回归JavaScript基础(三)

    主题:JavaScript基本概念. 任何语言的核心必然会描述这门语言最基本的工作原理.这部分内容对我们来说,读起来很乏味,甚至会产生困意,但这部分内容却是重要的!我有幸拜读<JavaScrip ...

  6. 解决国外模板h1、h2、h3...不显示中文文章标题的问题

    如果你经常用国外好看的网页模版时候,会遇到不显示中文文章标题的情况,显示英文标题却正常.遇到这个情况很多人认为应该修改CSS的font-family的字体,其实这是错误的,与CSS无关. 出现这种情况 ...

  7. Spring MVC 常用Jar包

    spring:http://maven.springframework.org/release/org/springframework/spring/ jackson:http://repo1.mav ...

  8. UML建模中简单消息、同步消息和异步消息

    两种消息在UML图中的表示方法如图: 1.同步方式 两个通信应用服务之间必须要进行同步,两个服务之间必须都是正常运行的.发送程序和接收程序都必须一直处于运行状态,并且随时做好相互通信的准备. 发送程序 ...

  9. 《CDN 之我见》原理篇——CDN的由来与调度

    CDN是将源站内容分发至全国所有的节点,从而缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性的技术.它能够有效解决网络带宽小.用户访问量大.网点分布不均等问题. 为了让大家更全面的了解 ...

  10. 一、Linux概述 二、Linux的安装 三、Linux的常用命令(重点)

    一.Linux概述###<1>操作系统 OS,管理和控制 计算机的 硬件和软件资源的 计算机程序. 最基本的系统软件. 是用户和计算机交互的桥梁,是硬件和软件交互的桥梁. 操作系统:she ...