1.selenium

  Selenium 本是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。而这一特性为爬虫开发提供了一个选择及方向,由于其本身依赖于浏览器,所以使用Python的selenium库的前提是:需要下载相应的浏览器驱动程序,这里附上Chromedriver的下载地址:chromedriver;(64位的向下兼容,)

2.code:

  说明:

    1.多线程爬取(producer&consumer modal);

    2.结果集的存取文件类型为csv格式;

    3.大三党一枚,代码噪点多提出来哦,相互学习。

#coding:utf-8

from selenium import webdriver
from lxml import etree
import csv
import time
import re
import threading
import queue
from selenium.webdriver.common.by import By
import random POSITIONS_INFO = queue.Queue()
event = threading.Event() def write_to_csv(file):
with open(file, 'a', encoding='utf-8', newline="") as f:
writer = csv.DictWriter(f, ['name', 'salary', 'addr', 'experience', 'degree', 'type', 'advantage', 'detail'])
writer.writeheader()
while True:
if POSITIONS_INFO.empty():
event.wait()
writer.writerow(POSITIONS_INFO.get()) class LagouSpider(threading.Thread):
driver_path = r'D:\Pythonlearning\chromedriver.exe'
options = webdriver.ChromeOptions()
options.add_argument('--proxy-server="http://117.63.87.177:9999"')
def __init__(self, kw, *args, **kwargs):
super(LagouSpider, self).__init__(*args, **kwargs)
self.driver = webdriver.Chrome(executable_path=self.driver_path)
self.url = r'https://www.lagou.com/jobs/list_%s?labelWords=&fromSearch=true&suginput=' % kw def run(self):
self.driver.get(self.url)
cur_page_source = self.driver.page_source
# 总页数
max_page_num = int(self.driver.find_element(By.XPATH, "//span[contains(@hidefocus, 'hidefocus')][last()-1]").text)
for page in range(1, max_page_num):
self.parse_cur_page(cur_page_source)
# 爬取当前页, 点击下一页进行抓取
next_page_tag = self.driver.find_element(By.CSS_SELECTOR, "div.pager_container .pager_next")
next_page_tag.click() # 防止被识别, 设置随机等待秒数
rand_seconds = random.choice([2,3])+random.random()
time.sleep(rand_seconds)
cur_page_source = self.driver.page_source def parse_cur_page(self, cur_page_source):
"""解析结果页,解析出所有的待爬取职位信息页地址"""
html = etree.HTML(cur_page_source)
info_links = html.xpath("//a[contains(@class, 'position_link')]")
for link in info_links:
# print(link.get('href'))
link_addr = link.get('href', None)
self.request_info_page(link_addr) def request_info_page(self, page_url:str):
"""获取职位详情页"""
js_code = "window.open('%s')" % page_url
self.driver.execute_script(js_code)
# 解析当前信息页
cur_handles = self.driver.window_handles
self.driver.switch_to_window(cur_handles[-1])
self.parse_position_page(self.driver.page_source)
# 解析完成, 关闭当前标签卡并切换回原窗口
self.driver.close()
self.driver.switch_to_window(cur_handles[0]) def parse_position_page(self, html):
# print(html)
"""解析职位详情页"""
list_xpath = {
"job_name_xpath" : "//div[@class='job-name']/span[@class='name']/text()",
"job_salary_xpath" : "//dd[contains(@class, 'job_request')]//span[@class='salary']/text()",
"job_addr_xpath" : "//dd[contains(@class, 'job_request')]//span[2]/text()",
"job_experience_xpath" :"//dd[contains(@class, 'job_request')]//span[3]/text()",
"job_degree_xpath" : "//dd[contains(@class, 'job_request')]//span[4]/text()",
"job_type_xpath" : "//dd[contains(@class, 'job_request')]//span[5]/text()",
"job_advantage_xpath": "//dd[contains(@class, 'job-advantage')]/p/text()",
"job_detail_xpath": "//div[@class='job-detail']/*/text()",
} key_name = ['name', 'salary', 'addr', 'experience', 'degree', 'type', 'advantage', 'detail'] cur_position_info = dict()
cur_html = etree.HTML(html) for index, xpath in enumerate(list_xpath.values()):
cur_val = cur_html.xpath(xpath)
if len(cur_val) == 1:
temp_value = re.sub(r'[\s/<.*?>\\]', "", cur_val[0].strip()) else:
temp_value = re.sub(r'[\s/<.*?>\\\]\[]', "", "".join(cur_val))
# 去掉\xa0(&nbsp;)
temp_value = "".join(temp_value.split())
temp_key = key_name[index]
cur_position_info[temp_key] = temp_value print(cur_position_info)
# {'name': '高级java开发工程师', 'salary': '20k-35k', 'addr': '上海', 'experience': '经验5-10年', 'degree': '大专及以上', 'type': '全职', 'advantage': '电商微服务', 'detail': '任职资格:1、计算机或相关专业本科以上学历,具有4年以上JAVA开发经验;2、熟练掌握数据结构、多线程编程,掌握常用的设计模式;熟悉JVM,包括内存模型、类加载机制以及性能优化;3、熟练掌握Java语言,熟悉Spring、SpringMVC、mybatis、springboot等框架;4、掌握数据库设计,熟练使用数据库如Mysql、Mongodb、Redis等;5、熟悉linux常用的shell命令;6、熟悉rpc开发,有过分布式开发经验者优先;7、具有很强的分析复杂问题和解决复杂问题的能力,有强烈的责任心和使命感,良好的沟通表达能力和团队协作能力。8、熟悉常见的中间件、分布式解决方案及其原理:分布式缓存、SOA、消息中间件,负载均衡、连接池等;9、具有一定的项目规划和决策能力,善于捕捉业务需求、架构设计中存在的问题,并给出有效的解决措施和方法;'}
POSITIONS_INFO.put(cur_position_info)
# gCondition.notify_all()
event.set() def main():
spider = LagouSpider('java')
spider.start()
writer = threading.Thread(target=write_to_csv, args=['lagou.csv',])
writer.start() if __name__ == '__main__':
main()

基于selenium爬取拉勾网职位信息的更多相关文章

  1. 【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

    上次挖了一个坑,今天终于填上了,还记得之前我们做的拉勾爬虫吗?那时我们实现了一页的爬取,今天让我们再接再厉,实现多页爬取,顺便实现职位和公司的关键词搜索功能. 之前的内容就不再介绍了,不熟悉的请一定要 ...

  2. node.js爬虫爬取拉勾网职位信息

    简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳.杭州.西安.成都7个城市的数据,分别以前端.PHP.java.c++.python.Androi ...

  3. python爬虫(三) 用request爬取拉勾网职位信息

    request.Request类 如果想要在请求的时候添加一个请求头(增加请求头的原因是,如果不加请求头,那么在我们爬取得时候,可能会被限制),那么就必须使用request.Request类来实现,比 ...

  4. python爬取拉勾网职位信息-python相关职位

    import requestsimport mathimport pandas as pdimport timefrom lxml import etree url = 'https://www.la ...

  5. 【实战】用request爬取拉勾网职位信息

    from urllib import request import urllib import ssl import json url = 'https://www.lagou.com/jobs/po ...

  6. 爬取拉勾网招聘信息并使用xlwt存入Excel

    xlwt 1.3.0 xlwt 文档 xlrd 1.1.0 python操作excel之xlrd 1.Python模块介绍 - xlwt ,什么是xlwt? Python语言中,写入Excel文件的扩 ...

  7. scrapy抓取拉勾网职位信息(一)——scrapy初识及lagou爬虫项目建立

    本次以scrapy抓取拉勾网职位信息作为scrapy学习的一个实战演练 python版本:3.7.1 框架:scrapy(pip直接安装可能会报错,如果是vc++环境不满足,建议直接安装一个visua ...

  8. selenium模块使用详解、打码平台使用、xpath使用、使用selenium爬取京东商品信息、scrapy框架介绍与安装

    今日内容概要 selenium的使用 打码平台使用 xpath使用 爬取京东商品信息 scrapy 介绍和安装 内容详细 1.selenium模块的使用 # 之前咱们学requests,可以发送htt ...

  9. python-scrapy爬虫框架爬取拉勾网招聘信息

    本文实例为爬取拉勾网上的python相关的职位信息, 这些信息在职位详情页上, 如职位名, 薪资, 公司名等等. 分析思路 分析查询结果页 在拉勾网搜索框中搜索'python'关键字, 在浏览器地址栏 ...

随机推荐

  1. 如何让Android微博个人详情页滚动到顶部

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/103 个人详情页滑动到顶部 最近产品提了个新需求,需要实现 ...

  2. 哈夫曼费用计算C++

    #include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #in ...

  3. Rsync 实现远程同步

    介绍 rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部 ...

  4. php分页例子实现读取mysql数据分页显示

    以下代码是PHP分页案例,测试通过,主要是PHP+mysql实现分页,代码来处百度空间,有兴趣看的话可以了解一下PHP是如何分页的? <?php $link = mysql_connect(&q ...

  5. stack(单调栈) POJ 2082 Terrible Sets

    题目传送门 题意:紧贴x轴有一些挨着的矩形,给出每个矩形的长宽,问能组成的最大矩形面积为多少 分析:用堆栈来维护高度递增的矩形,遇到高度小的,弹出顶部矩形直到符合递增,顺便计算矩形面积,且将弹出的宽度 ...

  6. Excel 宏练习

    任务描述: 利用 Excel 绘制函数图像 f(x)=x^2/3+0.9*(3.3-x^2)^1/2*sin(a*x),并通过按钮事件来刷新图像. 问题分析: 可以参考类似 Matlab 绘图的方式, ...

  7. Backbone学习记录(6)

    路由 backbone将路由规则和一个方法名绑定到一起,来控制单页的hash,以及单页的前进后退. var UserRouter = Backbone.Router.extend({ routes: ...

  8. poj2112Optimal Milking(二分+最大流)

    链接 floyd求出牛到机器的最短距离,二分距离,小于当前距离的边容量设为1,求出满容量下的最短距离. EK算法 #include <iostream> #include<cstdi ...

  9. this关键字实现串联构造函数调用

    在一个类中如果需要实现多个自定义构造函数,通常做法是在构造函数中实现各自的业务逻辑,如果这些业务逻辑的实现并非截然不同的话,显然不符合oop编程思想,极不利于维护,当然,我们也可以通过将相同的逻辑部分 ...

  10. js实现跨域的方法

    由于同源策略的限制,XMLHttpRequest只允许请求当前源(包含域名.协议.端口)的资源. json与jsonp的区别:    JSON是一种数据交换格式,而JSONP是一种依靠开发人员创造出的 ...