上次留了个坑,采取两种方式对需要爬取的网站进行数据抓取。首先使用selenium+chromedriver进行抓取,这种方式速度慢,但是可以跳过各种反爬设置,并对各种反爬能够直接以网页的形式进行显示。因此我们可以采取这种方式进行测试,找到其中的反爬规则,然后采用通用爬虫进行爬取。今天下午闲着没事对boss直聘进行了测试

第一种:selenium+chromedriver

鉴于代码不长,就直接贴代码了:

import pymysql
import re
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from lxml import etree
import time
from datetime import datetime,timedeltapath=r'I:\code\selenimu_chromedriver\chromedriver_win32\chromedriver.exe'
class LagouSpider(object):path = r'I:\code\selenimu_chromedriver\chromedriver_win32\chromedriver.exe'def __init__(self):self.dicts={}self.driver=webdriver.Chrome(executable_path=LagouSpider.path)self.url='https://www.zhaopin_spider.com/jobs/list_%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98?labelWords=&fromSearch=true&suginput='def run(self):self.driver.get(self.url)time.sleep(50)# 在调用的chromedriver中提前登录,避免爬取过程中被要求登录while True:#  显示等待‘下一页’避免爬取太快获取不到该元素WebDriverWait(driver=self.driver,timeout=15).until(EC.presence_of_element_located((By.XPATH,"//div[@class='pager_container']/span[last()]")))next_page=self.driver.find_element_by_xpath("//div[@class='pager_container']/span[last()]")#以下这种方法会丢失最后一页数据,可以使用for循环,先查看总页数总数,避免数据丢失if 'pager_next pager_next_disabled' not in next_page.get_attribute('class'):passelse:source = self.driver.page_sourceself.parse_list_source(source)next_page.click()def parse_list_source(self,source):html=etree.HTML(source)list_url=html.xpath("//div[@class='list_item_top']/div[@class='position']/div[@class='p_top']/a/@href")for link in list_url:self.request_detail_source(link)print(link)time.sleep(3)def request_detail_source(self,url):self.driver.execute_script("window.open('%s')"%url)# 打开新的窗口self.driver.switch_to.window(self.driver.window_handles[1])# 切换到新的窗口source=self.driver.page_sourcesource=etree.HTML(source)salary = source.xpath("//dd[@class='job_request']/p[1]/span[@class='salary']/text()")# 该if-else 是为了避开验证信息,如果没有筛选到'salary'元素直接关掉该页面,缺点是丢失一页数据if len(salary) ==0:self.driver.close()self.driver.switch_to.window(self.driver.window_handles[0])else:salary=source.xpath("//dd[@class='job_request']/p[1]/span[@class='salary']/text()")[0].strip()adress=source.xpath("//dd[@class='job-address clearfix']/div[@class='work_addr']/a/text()")adress.pop(-1)adress="".join(adress)company = source.xpath("//h2[@class='fl']/em[@class='fl-cn']/text()")[0].strip()experience=source.xpath("//dd[@class='job_request']/p[1]/span[3]/text()")[0].strip('/').strip()education=source.xpath("//dd[@class='job_request']/p[1]/span[4]/text()")[0].strip('/').strip()tempting = source.xpath("//dd[@class='job-advantage']/p/text()")[0]# 以下是将requirement划分为responsibility和demand,由于这部分内容无特定格式,可能会丢失数据requirement = source.xpath("//dl[@id='job_detail']/dd[@class='job_bt']/div//text()")#  这种替换方法比较蠢,因此不用#temporary_variable = 0# for i in requirement:#     i = str(i).strip()#     requirement[temporary_variable] = i#     temporary_variable += 1requirement = "".join(requirement)requirement=re.sub('\n','',requirement).strip()requirement=re.sub(r"\xa0","",requirement)a = re.split(r'(工作要求|任职要求|任职资格|岗位要求|岗位职责|工作职责|岗位职能|我们期望|工作内容)', requirement, 3)demand=0responsibility=0if len(a)==5:if a[1] in ("岗位职责","工作职责","岗位职能",'工作内容','关于职位'):# 判断条件用in 而非 orresponsibility=a[1] + a[2]elif a[1]==0:demand=a[1] + a[2]if a[3] in ("岗位职责","工作职责","岗位职能",'工作内容','关于职位'):#  带上括号控制优先级responsibility = a[3] + a[4]else:demand = a[3] + a[4]else:pass# 对取到的三种时间格式进行处理,最终得到发布日期(没有精确到分,为了格式统一)times = source.xpath("//p[@class='publish_time']/text()")[0]start_time = re.match('(\d\d:\d\d)|(\d天前)|(\d*-\d*-\d*)', times)start_time=start_time.group()if len(start_time) == 3:now = datetime.now()start_time = str(now - timedelta(days=int(list(start_time)[0])))elif len(start_time) == 5:start_time = str(datetime.now())else:pass#print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s"%(salary,adress,company,experience,tempting,responsibility,demand,start_time))# 存入数据库conn=pymysql.connect(host="localhost",port=3306,user='root',password='as123456',database='zhaopin_spider',charset='utf8')cursor=conn.cursor() #创建游标对象sql = "INSERT INTO data_analysis(salary,adress,company, experience, tempting, responsibility,demand,start_time,url)\VALUES ('%s','%s','%s','%s','%s','%s','%s',cast('%s' as datetime),'%s')"%(salary,adress,company,experience,tempting,responsibility,demand,start_time,str(url))cursor.execute(sql)conn.commit()self.driver.close()self.driver.switch_to.window(self.driver.window_handles[0])if __name__=='__main__':lagou=LagouSpider()lagou.run()
#

第二种:基于httpclient

从上面的测试来看,boss直聘基本没设置什么反爬措施,甚至连cookie都不用传,这样就比较简单了,代码不长,直接上代码了:


import requests
from lxml import etree
class ZhiPin(object):def __init__(self):self.header={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134","Accept-Language": "zh-Hans-CN,zh-Hans;q=0.5","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Upgrade-Insecure-Requests": "1",#"Accept-Encoding": "gzip, deflate, br","Host": "www.zhipin.com",#"Connection": "Keep-Alive"}self.add_url='https://www.zhipin.com'self.start_url = 'https://www.zhipin.com/c100010000/?query=%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98&page=1&ka=page-2'def run(self):response = requests.get(self.start_url, headers=self.header)data = etree.HTML(response.text)  # etree.HTML解析字符串类型数据self.get_urls(data)self.get_lists_page(data)def get_lists_page(self,data):next_page_url = data.xpath("//div[@class='job-list']/div[@class='page']/a[@class='next']/@href")if len(next_page_url) != 0:next_page_url=next_page_url[0]print(next_page_url)if '/c100010000' in next_page_url:next_page_url = self.add_url + next_page_urlself.start_url=next_page_urlself.run()else:print(data.text)else:print('爬完了')def get_urls(self,data):urls=data.xpath("//div[@class='info-primary']/h3[@class='name']/a/@href")for url in urls:url=self.add_url+urlself.url=urlself.get_detial_page(url)def get_detail_page(self,url):print(url)if __name__=="__main__":zhipin=ZhiPin()zhipin.run()

注意上面代码没有爬取详情页具体内容,只是进入详情页测试了一下,需要爬具体内容的可以自己写哈

两种方式对boss直聘招聘岗位的爬取相关推荐

  1. python爬取boss直聘招聘信息_Python 爬取boss直聘招聘信息!

    原标题:Python 爬取boss直聘招聘信息! 1.一些公共方法的准备 获取数据库链接: importpymysql ''' 遇到不懂的问题?Python学习交流群:821460695满足你的需求, ...

  2. BOSS直聘网站数据分析岗位信息爬取

    Boss直聘网站已改用ajax了,可以改用selenium库爬取,下面爬虫已过时,但数据分析方法还是可以用的,数据分析全部代码都已给出. 语言:Python3 目录 一.信息爬取 二.数据分析 2.1 ...

  3. 基于‘BOSS直聘招聘信息’分析企业到底需要什么样的PHPer

    基于'BOSS直聘招聘信息'分析企业到底需要什么样的PHPer 前两篇文章都没看,好意思直接看结果? Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息 Pyhton爬虫实战 - 抓取 ...

  4. python爬取招聘信息_python 爬取boss直聘招聘信息实现

    原标题:python 爬取boss直聘招聘信息实现 1.一些公共方法的准备 获取数据库链接: importpymysql ''' 遇到不懂的问题?Python学习交流群:821460695满足你的需求 ...

  5. python爬取boss直聘招聘信息_Python爬虫实战-抓取boss直聘招聘信息

    Python Python开发 Python语言 Python爬虫实战-抓取boss直聘招聘信息 实战内容:爬取boss直聘的岗位信息,存储在数据库,最后通过可视化展示出来 PS注意:很多人学Pyth ...

  6. 用BeautifulSoup简单爬取BOSS直聘网岗位

    用BeautifulSoup简单爬取BOSS直聘网岗位 爬取python招聘 import requests from bs4 import BeautifulSoupdef fun(path):r1 ...

  7. python爬取boss直聘招聘信息_年底啦,利用Python爬取Boss直聘的招聘信息,为明年跳槽做准备...

    原标题:年底啦,利用Python爬取Boss直聘的招聘信息,为明年跳槽做准备 前言 为什么都说程序员的薪资高,但是刚开始入职的你,薪资并不是自己想象中的那样,首先是你的工作经验不足,其次就是需要不断的 ...

  8. python爬取boss直聘招聘信息_Python笔记-爬取Boss直聘的招聘信息

    2018-05-09笔记: 最近迷上了爬虫,爬取招聘信息,存在MongoDB上 代码思路和上一篇爬取酷狗TOP500差不多,但是在使用CSS选择器的时候,有两组信息是连在一起,所以使用正则来获取 本来 ...

  9. python爬取boss直聘招聘信息_python学习之路-爬取boss直聘的岗位信息

    背景 想了解从事python相关岗位需要具备什么技能,于是就想从招聘网站上的职位需求入手,把信息获取下来后,生成词云,这样就能很直观的看出来哪些技能是python相关岗位需要具备的了. 技术概览 sc ...

最新文章

  1. 2022-2028年中国智慧物流行业深度调研及投资前景预测报告(全卷)
  2. iis7下站点日志默认位置
  3. java 线程池 初始大小,Java线程池ThreadPoolExecutor的实现和参数
  4. python【OS操作系统库】Python的os模块大宝剑(全)
  5. yolo v3制作自己的数据_小白也能弄懂的目标检测之YOLO系列 第一期
  6. Java 关于File使用
  7. Python规范:提高可读性
  8. python_day6 shutil模块
  9. 科技部成立新一代人工智能发展研究中心
  10. 怎么取消打开文件的安全警告?
  11. FireFox 32不支持64位的NPAPI dll插件
  12. iptables应用
  13. iOS 版本更新迭代
  14. 一年中所有节日的排列顺序_中国传统节日有哪些 按顺序排列全部
  15. 清华大学计算机直硕生,推免数据 | 清华大学计算机系三大巨变——直硕生减半,本校增多,211增多...
  16. 计算机分屏显示知识,如何使用Windows的分屏显示功能
  17. 服务器cpu对游戏的支持,还想用服务器CPU玩游戏?其实没必要,至强E3-1231 V3时代已不在...
  18. 自动驾驶技术基础——GNSS
  19. 鱼跃CMS-轻量开源企业CMS v1.4.6
  20. 毕业四年年薪200万是怎样的一种体验?

热门文章

  1. 记异或的妙处(异或1)
  2. 炼成百万富翁:不离婚不搬家少生子成致富条件
  3. OPPO 5G手机亮相,拉开移动产业的再次变革
  4. html5 input email,html - HTML5 Email input pattern attribute - Stack Overflow
  5. C# Color颜色RGB对照表、颜色选择器
  6. 类,对象,方法与函数的区别
  7. Azure Q4增速放缓至47% 微软能否借“云”站上科技股市值C位?
  8. linux或者deepin环境下安装破解navicat
  9. Django模板中models.py文件的时间字段详解
  10. 理解Android虚拟机结构