使用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. .NETFramework:HttpRuntime

    ylbtech-.NETFramework:HttpRuntime 1.返回顶部 1. #region 程序集 System.Web, Version=4.0.0.0, Culture=neutral ...

  2. 【旧文章搬运】如何从EPROCESS辨别一个进程是否已退出

    原文发表于百度空间,2008-7-31========================================================================== 前面已经通过 ...

  3. 详述IntelliJ IDEA插件的安装及使用方法(图解)

    intellij idea是一款非常优秀的软件开发工具,它拥有这强大的插件体系,可以帮助开发者完成很多重量级的功能.今天,我们来学习一下如何安装和卸载intellij idea的插件. Intelli ...

  4. Android菜单代码

    前言: 学习android断断续续也有一年半左右,但一直在学习,很少回顾以往的知识.所以我打算用业余时间来写一些这样总结性的文章,希望温故知新. 以下只是我个人的一些感悟和见解(当然会查证资料验证), ...

  5. 一个获取google chrome扩展crx文件信息的PHP操作类

    此类中实现了从crx文件获取扩展的Appid.获取manifest.json文件内容.将crx文件转换为一般zip文件 代码如下: <?php class CrxParserException ...

  6. Mac下Apache服务器和webDav服务器快速配置

    当自己在家敲代码需要发请求时,就可以配置本地Apache,Mac电脑自带的服务器.这个比windows上的本地服务器还要好用,下面写下最快速配置方案. 0.在开始之前需要给自己的电脑设置下开机密码,想 ...

  7. qq教xixi写模拟加法【非常爆炸】

    #include<iostream> #include<cstdio> #include<math.h> #include<queue> #includ ...

  8. python int对象的方法

    1.求绝对值 >>> a = -10 >>> a.__abs__() 10 >>> abs(10) 10 2.加法 >>> a ...

  9. python __builtins__ range类 (56)

    56.'range',  创建一个整数列表 class range(object) | range(stop) -> range object | range(start, stop[, ste ...

  10. 如果没有intelliJ 编译器?

    刚刚是了一晚上的用记事本来写代码,脱离编译器,发现自己完全废了. 写了好多个类,在命令行编译失败,上网查错误,说编码问题, 编码问题解决后,命令行还是编译失败,粘贴到编译器 发现完全是自己代码能力太弱 ...