当前位置:   article > 正文

2024爬虫 用selenium 爬取 51job(前程无忧)代码_51job 爬虫

51job 爬虫

       最近想要练习一下爬虫,但是打开51job的页进行操作发现,url地址基本不怎么变化,不太容易提取url地址,发现无论是搜索 java 还是 python 地址是不变的,点击页码地址也不会变化。所以用操作地址的爬虫框架就不太容易操作了,下面是使用selenium爬取51job的具体流程,代码部分几乎每一行都有注释

一、在操作之前需要先下载一下与本机chrome版本基本一致的chrome驱动

驱动下载地址icon-default.png?t=N7T8http://chromedriver.storage.googleapis.com/index.html

  谷歌浏览器版本

驱动版本 

二、 xpath地址的获取方式

以下边第一行代码为例

  1. # 向搜索框传入关键字
  2. web.find_element(By.XPATH, '//*[@id="keywordInput"]').send_keys(keyword)
  3. # 点击搜索
  4. web.find_element(By.XPATH, '//*[@id="search_btn"]').click()

 经过上边三步就可以获得xpath地址了,是不是很简单!


一级页面

观察页面发现有用的数据基本都在这个地方,除了公司名称公司性质公司规模

公司名称公司性质公司规模 在这个地方

二级页面 

三、完整代码

  1. from datetime import datetime
  2. from time import sleep
  3. import json
  4. import ktool
  5. from selenium.webdriver.chrome.options import Options
  6. from selenium.webdriver import Chrome
  7. from selenium.webdriver.common.by import By
  8. from mysql_util import MysqlUtil
  9. url = 'https://we.51job.com/pc/search?keyword=&searchType=2&sortType=0&metro=' #初始url地址
  10. opt = Options()
  11. opt.add_argument("--headless") # 无界面启动
  12. opt.add_experimental_option('useAutomationExtension', False) # 禁用Chrome的自动化拓展程序
  13. opt.add_experimental_option('excludeSwitches', ['enable-automation']) # 确保浏览器不会因为启用自动化模式而出现不必要的错误或异常。
  14. opt.add_argument('--disable-blink-features=AutomationControlled') # 禁用由自动化测试或脚本控制的 Blink 功能。
  15. #chrome驱动 这里需要换成自己的驱动位置
  16. web = Chrome(options=opt, executable_path=r'C:\Program Files (x86)\ESBrowser\chromedriver.exe')
  17. web.get(url)
  18. # 网速快的可以把时间调到小一点
  19. sleep(2)
  20. # 搜索关键字,可以自己定义想爬取的职位
  21. keyword = "python"
  22. c_name = '_%s_%s' % (keyword, datetime.now().strftime('%Y_%m_%d'))
  23. # 实例化数据库创建数据表
  24. db = MysqlUtil()
  25. sql = "CREATE TABLE IF NOT EXISTS {} " \
  26. "(id INT AUTO_INCREMENT PRIMARY KEY,jobTitle VARCHAR(50)," \
  27. "company_name VARCHAR(50),jobArea VARCHAR(20),jobDegree VARCHAR(50)," \
  28. "company_nature VARCHAR(50),company_scale VARCHAR(50),jobTime datetime," \
  29. "job_information TEXT,createDatetime datetime)".format(c_name)
  30. db.create_table(sql)
  31. # 向搜索框传入关键字
  32. web.find_element(By.XPATH, '//*[@id="keywordInput"]').send_keys(keyword)
  33. # 点击搜索
  34. web.find_element(By.XPATH, '//*[@id="search_btn"]').click()
  35. sleep(1)
  36. # 原始窗口柄
  37. original_window = web.current_window_handle
  38. # 需要爬取的页数,现在的51job最大也只有50页
  39. total_page = 5
  40. for page in range(total_page):
  41. # 获取每一页的职位信息对象 [list]
  42. job_info = web.find_elements(By.XPATH,
  43. '//*[@id="app"]/div/div[2]/div/div/div[2]/div/div[2]/div/div[2]/div[1]/div')
  44. for one_job in job_info:
  45. # 获取存有关键内容的数据
  46. job_attributes = one_job.get_attribute('sensorsdata')
  47. # 转换成json格式
  48. job_attributes = json.loads(job_attributes)
  49. # 定义一个字典存储需要的关键信息
  50. search_result = {}
  51. # 工作名称
  52. search_result['jobTitle'] = job_attributes['jobTitle']
  53. # 公司名称
  54. try:
  55. search_result['company_name'] = one_job.find_element(By.XPATH, './div[4]/div[1]/a').text
  56. except Exception:
  57. search_result['company_name'] = "null"
  58. # 工作地点
  59. search_result['jobArea'] = job_attributes['jobArea']
  60. # 学历要求
  61. search_result['jobDegree'] = job_attributes['jobDegree']
  62. # 公司性质
  63. try:
  64. search_result['company_nature'] = one_job.find_element(By.XPATH, './div[4]/div[1]/span[2]').text
  65. except Exception:
  66. search_result['company_nature'] = "null"
  67. # 公司规模
  68. try:
  69. search_result['company_scale'] = one_job.find_element(By.XPATH, './div[4]/div[1]/span[3]').text
  70. except Exception:
  71. search_result['company_scale'] = "null"
  72. # 发布时间
  73. search_result['jobTime'] = job_attributes['jobTime']
  74. # 跳转到二级页面
  75. one_job.find_element(By.XPATH, './div[2]').click()
  76. sleep(2)
  77. # 获取二级页面窗口柄
  78. for window_handle in web.window_handles:
  79. if window_handle != original_window:
  80. web.switch_to.window(window_handle)
  81. break
  82. sleep(2)
  83. # 二级页面url
  84. url = web.current_url
  85. # 把二级页面的信息整合到一起,如果没有默认为地址
  86. job_information = ktool.xpath.xpath_union(
  87. web.page_source, '/html/body/div[2]/div[2]/div[3]/div[1]/div/text()',
  88. default=url
  89. )
  90. # 关闭二级页面
  91. web.close()
  92. # 返回一级页面
  93. web.switch_to.window(original_window)
  94. # 创建时间
  95. createDatetime = ktool.date.get_datetime()
  96. # 工作要求
  97. search_result['job_information'] = job_information
  98. search_result['createDatetime'] = createDatetime
  99. print(search_result)
  100. db = MysqlUtil()
  101. sql = "INSERT INTO %s (jobTitle, company_name, jobArea, jobDegree, " \
  102. "company_nature, company_scale, jobTime, job_information, createDatetime)" \
  103. "VALUES ('%s', '%s','%s','%s','%s','%s','%s','%s','%s')"\
  104. % (c_name,search_result['jobTitle'],search_result['company_name'],search_result['jobArea'],
  105. search_result['jobDegree'],search_result['company_nature'],search_result['company_scale'],
  106. search_result['jobTime'],search_result['job_information'],search_result['createDatetime'])
  107. # 插入数据库
  108. db.insert(sql)
  109. # 下一页按钮
  110. web.find_element(By.XPATH,
  111. '//*[@id="app"]/div/div[2]/div/div/div[2]/div/div[2]/div/div[3]/div/div/div/button[2]').click()
  112. sleep(1)
  113. web.quit()

数据库部分

  1. import pymysql
  2. class MysqlUtil():
  3. def __init__(self):
  4. '''
  5. 初始化方法,连接数据库
  6. '''
  7. host = '127.0.0.1' # 主机名
  8. user = 'root' # 数据库用户名
  9. password = '123456' # 数据库密码
  10. database = '51job' # 数据库名称
  11. self.db = pymysql.connect(host=host, user=user, password=password, db=database) # 建立连接
  12. self.cursor = self.db.cursor(cursor=pymysql.cursors.DictCursor) # 设置游标,并将游标设置为字典类型
  13. # 创建表
  14. def create_table(self,sql):
  15. try:
  16. self.cursor.execute(sql)
  17. self.db.commit()
  18. except Exception as e:
  19. print("发生异常", e)
  20. self.db.rollback()
  21. finally:
  22. self.db.close()
  23. # 插入数据
  24. def insert(self,sql):
  25. try:
  26. self.cursor.execute(sql)
  27. self.db.commit()
  28. except Exception as e:
  29. print("发生异常", e)
  30. self.db.rollback()
  31. finally:
  32. self.db.close()

有什么问题,希望大家能够指教,共同学习,如果对你有帮助,留个赞再走呗!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/573894
推荐阅读
相关标签
  

闽ICP备14008679号