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

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

import asyncio  # 异步编程库
import random  # 随机数生成库
import csv  # CSV文件处理库
from pyppeteer import launch  # 网页自动化测试库
from lxml import etree  # XML和HTML解析库


class Boss(object):
    def __init__(self):
        self.data_list = list()  # 数据列表

    def screen_size(self):
        """使用tkinter获取屏幕大小"""
        import tkinter  # GUI工具库
        tk = tkinter.Tk()  # 创建窗口
        width = tk.winfo_screenwidth()  # 获取屏幕宽度
        height = tk.winfo_screenheight()  # 获取屏幕高度
        tk.quit()  # 关闭窗口
        return width, height  # 返回屏幕宽度和高度

    async def main(self):
        try:
            browser = await launch(
                headless=False,  # 是否无头模式(可见/不可见浏览器)
                userDataDir="./config",  # 用户数据目录(用于保持浏览器会话)
                args=['--disable-infobars', '--window-size=1366,768', '--no-sandbox']  # 启动参数
            )

            page = await browser.newPage()  # 创建新页面
            width, height = self.screen_size()  # 获取屏幕大小
            await page.setViewport({'width': width, 'height': height})  # 设置页面视口大小

            await page.goto(
                'https://www.zhipin.com/?city=100010000&ka=city-sites-100010000')  # 打开目标网页
            await page.evaluateOnNewDocument(
                '''() =>{ Object.defineProperties(navigator, { webdriver: { get: () => false } }) }'''
            )  # 修改浏览器环境,防止被检测为自动化测试工具
            await asyncio.sleep(5)  # 等待页面加载

            # 查询数据岗位
            await page.type(
                '#wrap > div.column-search-panel > div > div > div.search-form > form > div.search-form-con > p > input',
                '大数据', {'delay': self.input_time_random() - 50}
            )  # 在搜索框中输入关键词
            await asyncio.sleep(2)  # 等待输入完成

            # 点击搜索按钮
            await page.click('#wrap > div.column-search-panel > div > div > div.search-form > form > button')
            await asyncio.sleep(5)  # 等待搜索结果加载

            i = 0
            while True:
                await asyncio.sleep(2)  # 等待页面加载
                content = await page.content()  # 获取页面内容
                html = etree.HTML(content)  # 解析页面内容
                self.parse_html(html)  # 解析内容
                await page.click(
                    '#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)'
                )  # 点击下一页按钮
                await asyncio.sleep(3)  # 等待页面加载
                i += 1
                print(i)
                # boss直聘限制翻页为10页,分省分批次抓取
                if i >= 10:
                    break
        except Exception as a:
            print(a)

    def input_time_random(self):
        return random.randint(100, 151)  # 生成随机的输入延迟时间

    def parse_html(self, html):
        li_list = html.xpath('//div[@class="search-job-result"]//ul[@class="job-list-box"]/li')  # 获取职位列表
        for li in li_list:
            job_name = li.xpath('.//span[@class="job-name"]/text()')[0]  # 工作名称
            job_salary = li.xpath('.//div[@class="job-info clearfix"]/span/text()')[0]  # 薪资待遇
            company_name = li.xpath('.//div[@class="company-info"]//h3/a/text()')[0]  # 公司名称
            job_exp = li.xpath('.//div[@class="job-info clearfix"]/ul/li/text()')[0]  # 年限要求
            job_address = li.xpath('.//span[@class="job-area"]/text()')[0]  # 工作地点
            welfare = ' '.join(li.xpath('.//div[@class="info-desc"]/text()'))  # 福利待遇
            demand = ''
            span_list = li.xpath('.//div[@class="job-card-footer clearfix"]/ul[@class="tag-list"]')
            for span in span_list:
                demand = ' '.join(span.xpath('./li/text()'))  # 任职需求
            print(job_name, job_salary, job_address, job_exp, company_name, demand, welfare)

            with open('boss_data.csv', encoding='utf-8', mode='a', newline='') as f:
                csv_writer = csv.writer(f)
                csv_writer.writerow([job_name, job_salary, job_address, job_exp, company_name, demand, welfare])  # 保存数据

    def run(self):
        asyncio.get_event_loop().run_until_complete(self.main())  # 运行异步任务


if __name__ == '__main__':
    with open('boss_data.csv', encoding='utf-8', mode='a', newline='') as f:
        csv_writer = csv.writer(f)
        csv_writer.writerow(['job_name', 'job_salary', 'job_address', 'job_exp', 'company_name', 'demand', 'welfare'])

    comment = Boss()
    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文件中。

  • 9
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潜意识^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值