当前位置:   article > 正文

利用python爬取招聘网站上的相关岗位信息_python爬取boss直聘招聘信息

python爬取boss直聘招聘信息

这段代码是一个爬取Boss直聘网站上数据岗位信息的爬虫程序。它使用了异步编程库asyncio和网页自动化测试库pyppeteer来实现异步的网页爬取和数据提取。 

  1. import asyncio  # 异步编程库
  2. import random  # 随机数生成库
  3. import csv  # CSV文件处理库
  4. from pyppeteer import launch  # 网页自动化测试库
  5. from lxml import etree  # XML和HTML解析库
  6. class Boss(object):
  7.     def __init__(self):
  8.         self.data_list = list()  # 数据列表
  9.     def screen_size(self):
  10.         """使用tkinter获取屏幕大小"""
  11.         import tkinter  # GUI工具库
  12.         tk = tkinter.Tk()  # 创建窗口
  13.         width = tk.winfo_screenwidth()  # 获取屏幕宽度
  14.         height = tk.winfo_screenheight()  # 获取屏幕高度
  15.         tk.quit()  # 关闭窗口
  16.         return width, height  # 返回屏幕宽度和高度
  17.     async def main(self):
  18.         try:
  19.             browser = await launch(
  20.                 headless=False,  # 是否无头模式(可见/不可见浏览器)
  21.                 userDataDir="./config",  # 用户数据目录(用于保持浏览器会话)
  22.                 args=['--disable-infobars', '--window-size=1366,768', '--no-sandbox']  # 启动参数
  23.             )
  24.             page = await browser.newPage()  # 创建新页面
  25.             width, height = self.screen_size()  # 获取屏幕大小
  26.             await page.setViewport({'width': width, 'height': height})  # 设置页面视口大小
  27.             await page.goto(
  28.                 'https://www.zhipin.com/?city=100010000&ka=city-sites-100010000')  # 打开目标网页
  29.             await page.evaluateOnNewDocument(
  30.                 '''() =>{ Object.defineProperties(navigator, { webdriver: { get: () => false } }) }'''
  31.             )  # 修改浏览器环境,防止被检测为自动化测试工具
  32.             await asyncio.sleep(5)  # 等待页面加载
  33.             # 查询数据岗位
  34.             await page.type(
  35.                 '#wrap > div.column-search-panel > div > div > div.search-form > form > div.search-form-con > p > input',
  36.                 '大数据', {'delay': self.input_time_random() - 50}
  37.             )  # 在搜索框中输入关键词
  38.             await asyncio.sleep(2)  # 等待输入完成
  39.             # 点击搜索按钮
  40.             await page.click('#wrap > div.column-search-panel > div > div > div.search-form > form > button')
  41.             await asyncio.sleep(5)  # 等待搜索结果加载
  42.             i = 0
  43.             while True:
  44.                 await asyncio.sleep(2)  # 等待页面加载
  45.                 content = await page.content()  # 获取页面内容
  46.                 html = etree.HTML(content)  # 解析页面内容
  47.                 self.parse_html(html)  # 解析内容
  48.                 await page.click(
  49.                     '#wrap > div.page-job-wrapper > div.page-job-inner > div > div.job-list-wrapper > div.search-job-result > div > div > div > a:nth-child(10)'
  50.                 )  # 点击下一页按钮
  51.                 await asyncio.sleep(3)  # 等待页面加载
  52.                 i += 1
  53.                 print(i)
  54.                 # boss直聘限制翻页为10页,分省分批次抓取
  55.                 if i >= 10:
  56.                     break
  57.         except Exception as a:
  58.             print(a)
  59.     def input_time_random(self):
  60.         return random.randint(100, 151)  # 生成随机的输入延迟时间
  61.     def parse_html(self, html):
  62.         li_list = html.xpath('//div[@class="search-job-result"]//ul[@class="job-list-box"]/li')  # 获取职位列表
  63.         for li in li_list:
  64.             job_name = li.xpath('.//span[@class="job-name"]/text()')[0]  # 工作名称
  65.             job_salary = li.xpath('.//div[@class="job-info clearfix"]/span/text()')[0]  # 薪资待遇
  66.             company_name = li.xpath('.//div[@class="company-info"]//h3/a/text()')[0]  # 公司名称
  67.             job_exp = li.xpath('.//div[@class="job-info clearfix"]/ul/li/text()')[0]  # 年限要求
  68.             job_address = li.xpath('.//span[@class="job-area"]/text()')[0]  # 工作地点
  69.             welfare = ' '.join(li.xpath('.//div[@class="info-desc"]/text()'))  # 福利待遇
  70.             demand = ''
  71.             span_list = li.xpath('.//div[@class="job-card-footer clearfix"]/ul[@class="tag-list"]')
  72.             for span in span_list:
  73.                 demand = ' '.join(span.xpath('./li/text()'))  # 任职需求
  74.             print(job_name, job_salary, job_address, job_exp, company_name, demand, welfare)
  75.             with open('boss_data.csv', encoding='utf-8', mode='a', newline='') as f:
  76.                 csv_writer = csv.writer(f)
  77.                 csv_writer.writerow([job_name, job_salary, job_address, job_exp, company_name, demand, welfare])  # 保存数据
  78.     def run(self):
  79.         asyncio.get_event_loop().run_until_complete(self.main())  # 运行异步任务
  80. if __name__ == '__main__':
  81.     with open('boss_data.csv', encoding='utf-8', mode='a', newline='') as f:
  82.         csv_writer = csv.writer(f)
  83.         csv_writer.writerow(['job_name', 'job_salary', 'job_address', 'job_exp', 'company_name', 'demand', 'welfare'])
  84.     comment = Boss()
  85.     comment.run()

主要功能和流程如下:

  1. 定义了一个名为Boss的类,该类用于爬取数据岗位信息并保存到CSV文件中。

  2. 在类的构造函数中初始化了一个数据列表self.data_list。

  3. 定义了一个名为screen_size的方法,使用tkinter库获取屏幕大小。

  4. 定义了一个异步方法main,该方法是程序的主要逻辑。

  5. 在main方法中,通过pyppeteer.launch()函数创建一个浏览器实例browser,设置了一些启动参数。

  6. 创建一个新页面page,并获取屏幕大小。

  7. 使用page.goto()方法打开Boss直聘网站的搜索页面,并等待页面加载。

  8. 使用page.evaluateOnNewDocument()方法修改浏览器环境,防止被检测为自动化测试工具。

  9. 输入搜索关键词"大数据"并点击搜索按钮。

  10. 循环爬取页面数据,每次点击下一页按钮,等待页面加载,解析页面内容并保存到self.data_list中。

  11. 限制最多翻页10次。

  12. 定义了一个input_time_random方法,生成随机的输入延迟时间。

  13. 定义了一个parse_html方法,用于解析页面内容并提取需要的数据,然后将数据保存到CSV文件中。

  14. 定义了一个run方法,用于运行异步任务。

  15. 在主程序中,先创建一个boss_data.csv文件,并写入表头。

  16. 创建一个Boss实例,并调用其run方法来执行爬取任务。

总的来说,这段代码通过模拟浏览器的方式访问Boss直聘网站,搜索关键词"大数据",然后将搜索结果中的数据岗位信息提取出来,并保存到CSV文件中。

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

闽ICP备14008679号