使用selenium+PhantomJS爬取拉钩网职位信息,保存在csv文件至本地磁盘

拉钩网的职位页面,点击下一页,职位信息加载,但是浏览器的url的不变,说明数据不是发送get请求得到的。

我们不去寻找它的API。这里使用另一种方式:使用PhantomJS模拟浏览,通过单击页面获取下一页。

这里的PhantomJS是一个没有界面的浏览器。

 from selenium import webdriver
import time
import random from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait '''
使用selenium+PhantomJS爬取拉钩网职位信息,保存到csv文件至本地磁盘
需要加请求头
''' '''
phantomjs.page.customHeaders. :自定义请求头的固定写法
如:定义代理:phantomjs.page.customHeaders.User-Agent
'''
dc = {
'phantomjs.page.customHeaders.User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
} # 创建浏览器对象
browser = webdriver.PhantomJS(executable_path=r'E:\PycharmProjects\pachong\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin\phantomjs.exe',desired_capabilities=dc) # 发送请求
browser.get('https://www.lagou.com/jobs/list_?labelWords=&fromSearch=true&suginput=')
time.sleep(2) # 保存网页截图
browser.save_screenshot('lagou.png') # 实例化wait对象 设置等待超时时间为20秒
wait = WebDriverWait(browser,20) # # 创建csv文件
f = open('lagou.csv','w',encoding='utf-8') while True:
# 获取数据
job_list = browser.find_elements_by_css_selector('.item_con_list li')
for job in job_list:
pname = job.find_element_by_tag_name('h3').text
ptime = job.find_element_by_class_name('format-time').text
company = job.find_element_by_css_selector('.company_name a').text
money = job.find_element_by_class_name('money').text
exp = job.find_element_by_class_name('li_b_l').text.split(' ')[1] #这里的text不取div里面的标签的内容,只取div中的内容。类名为li_b_l的div有两个,经验属于第二个,还有一个工作要求的
location = job.find_element_by_tag_name('em').text
reqtags = job.find_elements_by_css_selector('.li_b_l span') #div的类是li_b_l,里面含有很多span标签.会把工资的那一个也包含进来,后面需要处理
reqtags = ' '.join([reqtag.text for reqtag in reqtags][1:]) #每个条目的第一项是工资的那个,这里使用列表的切片去掉。 # 将数据放入一个列表,便于后面csv文件格式处理,使用,隔开每一项
data = [pname,ptime,company,money,exp,location,reqtags]
# print(data)
f.write(','.join(data) + '\n') print(data)
if 'pager_next pager_next_disabled' not in browser.page_source:
# 获取下一页按钮
wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'pager_next '))) #原网页中的类的最后有一个空格
# 点击进入下一页
browser.find_element_by_class_name('pager_next ').click()
time.sleep(3 + random.random()*1) #时间需要延长一点,时间太短,页面没有加载完成,获取数据会报错
else:
break # 关闭文件
f.close()

selelinum+PhantomJS 爬取拉钩网职位2

上面的代码中,使用selenium中的方法提取网页中的数据,有部分功能不好用,延时比较厉害。这里使用bs4提取网页中的数据,速度较快。

 from selenium import webdriver
import time
import re
import random
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
'''
selenium+Chrome 抓取拉钩网职位
使用xpath bs4解析。
''' browser = webdriver.Chrome(executable_path=r'E:\PycharmProjects\pachong\chromedriver.exe')
browser.get('https://www.lagou.com/jobs/list_?labelWords=&fromSearch=true&suginput=')
time.sleep(2)
f = open('lagou2.csv',mode='w',encoding='utf-8') #设置等待超时时间为20秒
wait = WebDriverWait(browser,20) # #使用Chrome驱动的提供的方法查找网页元素,在这里使用列表的分页,有延时
# while True:
# # 获取数据
# job_list = browser.find_elements_by_css_selector('.item_con_list li')
# for job in job_list:
# pname = job.find_element_by_tag_name('h3').text
# ptime = job.find_element_by_class_name('format-time').text
# company = job.find_element_by_css_selector('.company_name a').text
# money = job.find_element_by_class_name('money').text
# exp = job.find_element_by_class_name('li_b_l').text.split(' ')[1] #这里的text不取div里面的标签的内容,只取div中的内容。类名为li_b_l的div有两个,经验属于第二个,还有一个工作要求的
# location = job.find_element_by_tag_name('em').text
# reqtags = job.find_elements_by_css_selector('.li_b_l span') #div的类是li_b_l,里面含有很多span标签.会把工资的那一个也包含进来,后面需要处理
# reqtags = ' '.join([reqtag.text for reqtag in reqtags][1:]) #每个条目的第一项是工资的那个,这里使用列表的切片去掉。
#
# # 将数据放入一个列表,便于后面csv文件格式处理,使用,隔开每一项
# data = [pname,ptime,company,money,exp,location,reqtags]
# # print(data)
# f.write(','.join(data) + '\n')
#
# print(data)
# if 'pager_next pager_next_disabled' not in browser.page_source:
# # 获取下一页按钮
# wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'pager_next '))) #原网页中的类的最后有一个空格
# # 点击进入下一页
# browser.find_element_by_class_name('pager_next ').click()
# time.sleep(3 + random.random()*1) #时间需要延长一点,时间太短,页面没有加载完成,获取数据会报错
# else:
# break while True:
# 获取数据 wait.until(EC.presence_of_element_located((By.CLASS_NAME,'item_con_list'))) #等待职位信息加载 html = browser.page_source
html = BeautifulSoup(html,'lxml')
job_list = html.select('ul[class="item_con_list"] li') for job in job_list:
pname = job.h3.text
ptime = job.select('span[class="format-time"]')[0].text
company = job.select('div[class="company_name"] a')[0].text
money = job.select('span[class="money"]')[0].text
exp = job.select('div[class="li_b_l"]')[0].text
exp = re.split('\s',exp)[2] #使用正则切割 \s匹配所有空白,这里主要匹配 空格 和 \n。第三项是工作经验 location = job.select('span[class="add"] em')[0].text tags = job.select('div[class="li_b_l"] span') #tags 匹配出匹配出两部分,一部分是薪资,一部分是工作要求,后面进行过滤后只要工作要求
tag_list = [tag.text for tag in tags[1:]] #这里过滤掉薪资数据,只留下工作要求 # print(tag_list)
tags = ' '.join(tag_list)
data = [pname,ptime,company,money,exp,location,tags]
print(data) f.write(','.join(data) + '\n') if 'pager_next_disabled' not in browser.page_source:
# 获取下一页
wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'pager_next')))
browser.find_element_by_class_name('pager_next').click()
time.sleep(1+random.random()) #延时太短可能加载未完成。抓取页面数据程序会报错,在开头检测职位加载等待,这里时间可以少一点。
else:
break f.close()

selelinum+PhantomJS 爬取拉钩网职位的更多相关文章

  1. ruby 爬虫爬取拉钩网职位信息,产生词云报告

    思路:1.获取拉勾网搜索到职位的页数 2.调用接口获取职位id 3.根据职位id访问页面,匹配出关键字 url访问采用unirest,由于拉钩反爬虫,短时间内频繁访问会被限制访问,所以没有采用多线程, ...

  2. Python3 Scrapy + Selenium + 阿布云爬取拉钩网学习笔记

    1 需求分析 想要一个能爬取拉钩网职位详情页的爬虫,来获取详情页内的公司名称.职位名称.薪资待遇.学历要求.岗位需求等信息.该爬虫能够通过配置搜索职位关键字和搜索城市来爬取不同城市的不同职位详情信息, ...

  3. 爬取拉钩网上所有的python职位

    # 2.爬取拉钩网上的所有python职位. from urllib import request,parse import json,random def user_agent(page): #浏览 ...

  4. 使用request爬取拉钩网信息

    通过cookies信息爬取 分析header和cookies 通过subtext粘贴处理header和cookies信息 处理后,方便粘贴到代码中 爬取拉钩信息代码 import requests c ...

  5. 21天打造分布式爬虫-Selenium爬取拉钩职位信息(六)

    6.1.爬取第一页的职位信息 第一页职位信息 from selenium import webdriver from lxml import etree import re import time c ...

  6. Python 爬取拉钩网工作岗位

    如果拉钩网html页面做了调整,需要重新调整代码 代码如下 #/usr/bin/env python3 #coding:utf-8 import sys import json import requ ...

  7. 使用nodejs爬取拉勾苏州和上海的.NET职位信息

    最近开始找工作,本人苏州,面了几家都没有结果很是伤心.在拉勾上按照城市苏州关键字.NET来搜索一共才80来个职位,再用薪水一过滤,基本上没几个能投了.再加上最近苏州的房价蹭蹭的长,房贷压力也是非常大, ...

  8. selenium+phantomjs爬取京东商品信息

    selenium+phantomjs爬取京东商品信息 今天自己实战写了个爬取京东商品信息,和上一篇的思路一样,附上链接:https://www.cnblogs.com/cany/p/10897618. ...

  9. Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页

    Python3.x:Selenium+PhantomJS爬取带Ajax.Js的网页 前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但 ...

随机推荐

  1. dos窗口出现error:could not open ...jvm.cfg解决方法

    在cmd程序中,运行javac -version查看jdk是多少位时出现错误 error:could not open ...jvm.cfg解决方法 出现这种情况大多是因为电脑上之前安装过JDK,卸载 ...

  2. 微信小程序-B站:wxml和wxss文件

    WXML WXML(WeiXin Markup Language)是微信的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构. (小安娜:好像很厉害的样子,那基础组件.事件系统是什么?感觉更厉 ...

  3. 基于ANDROID平台,U3D对蓝牙手柄键值的获取

    对于ANDROID平台,物理蓝牙手柄已被封装,上层应用不可见,也就是说对于上层应用,不区分蓝牙手柄还是其它手柄: 完成蓝牙手柄和ANDROID手机的蓝牙连接后,即可以UNITY3D中获取其键值: 在U ...

  4. H5+JS实现手机摇一摇功能

    在做微信活动页面的时候,经常会需要实现手机摇一摇功能,比如“摇一摇,拿好礼”. 为了实现它,就需要用到HTML5的DeviceOrientation特性.它提供的DeviceMotion事件封装了设备 ...

  5. 日志系统:一条sql更新语句是如何执行的?--Mysql45讲笔记记录 打卡day2

    下面是一个表的创建语句,这个表有一个主键id和一个整型字段c: create table t(id int primary key,c int); 如果要将 id = 2 这一行的值加 1,sql语句 ...

  6. 2.while循环 编码的初识,逻辑运算符 格式化输出

    while循环 循环 while True: # while 是关键字 条件 print('精忠报国') print('团结就是力量') print('北京欢迎你') print('葫芦爷爷救娃娃') ...

  7. poj1273 Drainage Ditches 基础网络流

    #include <iostream> #include <queue> using namespace std; ][]; ]; //路径上每个节点的前驱节点 ]; int ...

  8. Centos 6.8安装 SVN

    SVN SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subver ...

  9. windows 异步通知I/O模型与重叠I/O模型

    一.异步IO模型(asynchronous IO) (1)什么是异步I/O 异步I/O(asynchronous I/O)由POSIX规范定义.演变成当前POSIX规范的各种早起标准所定义的实时函数中 ...

  10. android 浏览器对图片加载高度渲染问题

    今天在开发有道汉语词典移动版的时候遇到了一个很奇怪的问题. 在android设备上访问的时候,总是发现有底部背景色不能完全渲染出来的情况(有时候又是正常的,一会儿出现一会儿不出现,iphone设备也是 ...