python 爬虫系列09-selenium+拉钩
使用selenium爬取拉勾网职位
- from selenium import webdriver
- from lxml import etree
- import re
- import time
- from selenium.webdriver.support.ui import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.webdriver.common.by import By
- class LagouSpider(object):
- driver_path = r"D:\driver\chromedriver.exe"
- def __init__(self):
- self.driver = webdriver.Chrome(executable_path=LagouSpider.driver_path)
- self.url = 'https://www.lagou.com/jobs/list_%E4%BA%91%E8%AE%A1%E7%AE%97?labelWords=&fromSearch=true&suginput='
- self.positions = []
- def run(self):
- self.driver.get(self.url)
- while True:
- source = self.driver.page_source
- WebDriverWait(driver=self.driver,timeout=10).until(
- EC.presence_of_element_located((By.XPATH, "//div[@class='pager_container']/span[last()]"))
- )
- self.parse_list_page(source)
- try:
- next_btn = self.driver.find_element_by_xpath("//div[@class='pager_container']/span[last()]")
- if "pager_next_disabled" in next_btn.get_attribute("class"):
- break
- else:
- next_btn.click()
- except:
- print(source)
- time.sleep(1)
- def parse_list_page(self,source):
- html = etree.HTML(source)
- links = html.xpath("//a[@class='position_link']/@href")
- for link in links:
- self.request_detail_page(link)
- time.sleep(1)
- def request_detail_page(self,url):
- # self.driver.get(url)
- print()
- print(url)
- print()
- self.driver.execute_script("window.open('%s')" % url)
- self.driver.switch_to.window(self.driver.window_handles[1])
- WebDriverWait(self.driver,timeout=10).until(
- EC.presence_of_element_located((By.XPATH,"//div[@class='job-name']/span[@class='name']"))
- )
- source = self.driver.page_source
- self.parse_detail_page(source)
- self.driver.close()
- self.driver.switch_to.window(self.driver.window_handles[0])
- def parse_detail_page(self,source):
- html = etree.HTML(source)
- position_name = html.xpath("//span[@class='name']/text()")[0]
- job_request_spans = html.xpath("//dd[@class='job_request']//span")
- salary = job_request_spans[0].xpath('.//text()')[0].strip()
- city = job_request_spans[1].xpath(".//text()")[0].strip()
- city = re.sub(r"[\s/]", "", city)
- work_years = job_request_spans[2].xpath(".//text()")[0].strip()
- work_years = re.sub(r"[\s/]", "", work_years)
- education = job_request_spans[3].xpath(".//text()")[0].strip()
- education = re.sub(r"[\s/]", "", education)
- desc = "".join(html.xpath("//dd[@class='job_bt']//text()")).strip()
- company_name = html.xpath("//h2[@class='f1']/text()")
- position = {
- 'name': position_name,
- 'company_name': company_name,
- 'salary': salary,
- 'city': city,
- 'work_years': work_years,
- 'education': education,
- 'desc': desc
- }
- self.positions.append(position)
- print(position)
- if __name__ == '__main__':
- spider = LagouSpider()
- spider.run()
python 爬虫系列09-selenium+拉钩的更多相关文章
- python爬虫动态html selenium.webdriver
python爬虫:利用selenium.webdriver获取渲染之后的页面代码! 1 首先要下载浏览器驱动: 常用的是chromedriver 和phantomjs chromedirver下载地址 ...
- Python爬虫之设置selenium webdriver等待
Python爬虫之设置selenium webdriver等待 ajax技术出现使异步加载方式呈现数据的网站越来越多,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给定位元素的定位增加 ...
- Python爬虫系列-Selenium详解
自动化测试工具,支持多种浏览器.爬虫中主要用来解决JavaScript渲染的问题. 用法讲解 模拟百度搜索网站过程: from selenium import webdriver from selen ...
- PYTHON 爬虫笔记七:Selenium库基础用法
知识点一:Selenium库详解及其基本使用 什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium ...
- python爬虫之初始Selenium
1.初始 Selenium[1] 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Moz ...
- python 爬虫系列教程方法总结及推荐
爬虫,是我学习的比较多的,也是比较了解的.打算写一个系列教程,网上搜罗一下,感觉别人写的已经很好了,我没必要重复造轮子了. 爬虫不过就是访问一个页面然后用一些匹配方式把自己需要的东西摘出来. 而访问页 ...
- $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法
本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...
- Python爬虫系列 - 初探:爬取旅游评论
Python爬虫目前是基于requests包,下面是该包的文档,查一些资料还是比较方便. http://docs.python-requests.org/en/master/ POST发送内容格式 爬 ...
- python爬虫系列(2)—— requests和BeautifulSoup
本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...
- Python爬虫系列(七):提高解析效率
如果仅仅因为想要查找文档中的<a>标签而将整片文档进行解析,实在是浪费内存和时间.最快的方法是从一开始就把<a>标签以外的东西都忽略掉. SoupStrainer 类可以定义文 ...
随机推荐
- c# .NET开发邮件发送功能的全面教程(含邮件组件源码)
http://www.cnblogs.com/heyuquan/p/net-batch-mail-send-async.html
- wpf控件开发基础
wpf控件开发基础(3) -属性系统(2) http://www.cnblogs.com/Clingingboy/archive/2010/02/01/1661370.html 这个有必要看看 wpf ...
- ABP源码uml类图
陆陆续续学习ABP框架有一段时间了,阳光铭睿的入门教程和HK Zhang的源码分析文章对我的学习帮助都很大.之所以会花这么大工夫去学习ABP.看ABP的源代码,一是因为本人对于DDD也非常有兴趣,AB ...
- FileUtils 文件下载 文件导出
public class FileUtils { /// <summary> /// 文件下载 /// </summary> /// <param name=" ...
- HackThree
创建自定义ViewGroup 一,概要: 使用自定义View 和ViewGroup组织应用程序布局是一个好方法,定制组件的同时允许开发者提供自定义行为和功能,以后,开发者 在需要创建复杂布局 ...
- Java Serializable(序列化)的理解和总结
1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object st ...
- Android动态显示或隐藏密码框中的密码(Android学习笔记)
activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- OpenResty 最佳实践 (2)
此文已由作者汤晓静授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. lua 协程与 nginx 事件机制结合 文章前部分用大量篇幅阐述了 lua 和 nginx 的相关知识,包 ...
- App Store提交审核报错 ERROR ITMS-90087解决办法
1.原因说明 app对Wifi进行配网, 使用了GizWifiSDK.framework提交App Store时候报错了 App Store Connect Operation Error ERROR ...
- C# 在Winform设计一个耗时较久的任务在后台执行时的状态提示窗口
很多时候,我们需要在窗体中执行一些耗时比较久的任务.比如:循环处理某些文件,发送某些消息等... 单纯的依靠状态栏,用户体验不佳,按下功能按钮后得不到有效的提醒,小白用户绝对会电话给你说“我点了以后就 ...