使用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. 默认action和ActionSupport

    默认action: <action></action>中的name属性值与<default-action-ref></default-action-ref&g ...

  2. MongoDB之shard_副本集和分片部署

    机器角色分配和拓扑环境如下: -------------------配置副本集s1-------------------------------1.创建目录在s1h1上创建如下目录[root@node ...

  3. HTML 新属性

    accesskey 属性 -- 代表链接的快捷键访问方式 定义了accesskey的链接可以使用快捷键(ALT+字母)访问. 主菜单与导航菜单使用accesskey,通常是不错的选择. 取值: 字母 ...

  4. 一篇文章搞定面试中的链表题目(java实现)

    最近总结了一下数据结构和算法的题目,这是第二篇文章,关于链表的,第一篇文章关于二叉树的参见 废话少说,上链表的数据结构 class ListNode { ListNode next; int val; ...

  5. Ubuntu 18.04 LTS 常见问题解决 2

    1 每次重启后都有system program problem detected sudo gedit /etc/default/apport 然后将打开的文件中的enabled=1改为0,原因暂时不 ...

  6. 跟我一起玩Win32开发(23):渐变颜色填充

    GradientFill函数可以对特定的矩形区域或者三角形区域进行渐变颜色的填充.我们先来看看GradientFill函数到底长得什么样子,帅不帅. BOOL GradientFill( _In_   ...

  7. 自适应的两端对齐:text-align:justify

    <!DOCTYPE HTML> <html> <head> <title>文本两端对齐 by hongchenok</title> < ...

  8. Hdu 4778 Gems Fight! (状态压缩 + DP)

    题目链接: Hdu 4778 Gems Fight! 题目描述: 就是有G种颜色,B个背包,每个背包有n个宝石,颜色分别为c1,c2............两个人轮流取背包放到公共容器里面,容器里面有 ...

  9. Easy Game LightOJ - 1031

    Easy Game LightOJ - 1031 upd:似乎有复杂度更优越的做法,见http://www.cnblogs.com/hehe54321/p/8431020.html 题意:A和B玩一个 ...

  10. JAVA线程操作常见面试题 包括不使用内部类对多个线程加减1

    class ManyThreads2 { private int j = 0; public synchronized void inc() { j++; System.out.println(Thr ...