使用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. CQOI2013 新数独

    传送门 这道题也是很暴力的搜索啊…… 因为数独一开始全是空的,只有许许多多的大小限制条件,那也没必要纠结从哪开始搜索了,直接暴力搜索之后判断一下是否合法. 这题最恶心的是读入.现学了一招判断点在哪个块 ...

  2. MYSQL数据库学习----MYSQL函数

    MYSQL函数分为几种 数学函数 字符串函数 日期和时间函数 条件判断函数 系统信息函数 加密函数 格式化函数 一:数学函数 主要使用的几个数学函数 1 ABS()----绝对值函数 eg. SELE ...

  3. Laravel 新增的Switch模板控制语句非常不错

    切换语句switch语句可以使用来构建,,,和指令:@switch@case@break@default@endswitch @switch($i) @case(1) First case... @b ...

  4. 架构:MVVC

    ylbtech-架构:MVVC MVVM是Model-View-ViewModel的简写.它本质上就是MVC 的改进版.MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻 ...

  5. Hackerearth: Mathison and the Pokémon fights

    Mathison and the Pokémon fights code 这是一道比较有意思,出的也非常好的题目. 给定$n$个平面上的点$(x_i, y_i)$,(允许离线地)维护$Q$个操作:1. ...

  6. HDU-5538 House Building

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  7. ccflow_004请假流程-傻瓜表单-经典模式

    ccflow_004请假流程-傻瓜表单-经典模式

  8. .NET Core 跨平台物联网开发:设置委托事件(二)

    系列教程目录 (一) 连接阿里云IOT (二) 设置委托事件 (三) 上报属性 (四)  SDK文档 属性.方法.委托.类 http://pan.whuanle.cn/index.php?dir=up ...

  9. Nginx系列篇二:linux搭建Nginx负载均衡

    建议先搭建好Nginx环境 可阅读--->Linux中搭建Nginx 1.准备好三台服务器[标配] 一.nginx负载均衡服务器:192.168.102.110,配置好Nginx 二.tomca ...

  10. 决斗(Headshot )

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; char ...