使用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. Python之路,Day13 - 堡垒机

    项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功能只是堡垒 ...

  2. bzoj4566

    后缀自动机+dp 一个串在另一个串上跑. 先对A建出自动机,然后用B在上面跑,记录当前匹配的最大长度,每次经过一个节点记录经过次数,并加上(len-Max(par))*Right,是这个状态对答案的贡 ...

  3. (二十五)后台开发-分类信息的curd -展示所有实现

    案例1-分类信息的curd 步骤分析: 左边的dtree: 1.导入dtree.js 2.导入dtree.css 3.创建一个div 添加样式 class="dtree" 4.在d ...

  4. E20180327-hm

    renew vt. 补充; 重新开始; 使更新; 使恢复; vi. 重申,重复强调; 重新开始; renewal  n. 重建,重生; 更新,革新; 重申; 合同的续订;

  5. HDU 5101

    hdoj5101 lower_bound函数: 题意: 从两个不同集合拿出两个数,加的和大于k的可行的方案数 思路: 答案=从所有数中选择的两个加和大于k的数的方案数-在同一个集合中选择的两个加和大于 ...

  6. linux 读取部分文件内容

    一般我们在linux上读取文件,是用vi工具,如果是写shell 脚本时,一般式通过cat 再 使用管道来达到流的处理. 但如果文件太大,单纯的cat 可能会使用过多的内存,而且实现上还需要后续的加工 ...

  7. 第四篇 .NET高级技术之结构体及值类型引用类型

    结构体 在平时的开发中很少自己去写结构体,他是一种值类型的数据.对于结构,不像类那样存在继承,一个结构体不能从另一个结构或类继承.但是结构体从基类Object继承. 语法: //struct是定义结构 ...

  8. eclipse中alt+/的作用

    一般情况下alt+/有代码提示作用,还有代码提示的快捷代码也不是alt+/,因此要恢复代码提示用alt+/.需要做两件事.在 Window - Preferences - General - Keys ...

  9. Ubuntu 18.04 LTS 安装后 各种问题以及解决方案

    1. root的初始密码,默认是不知道的,需要进行设置 a. 进入终端自己的用户 b. 输入 sudo passwd回车 c. 输入新密码,回车,重复,回车,搞定 d. su 一下,就可以了 2.  ...

  10. iOS 获取当前响应链的First Responder (Swift)

    import UIKit private weak var currentFirstResponder: AnyObject? extension UIResponder { static func ...