利用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文件中。

### 抓取智联招聘 Python 职位信息的方法 要使用 Python 爬虫抓取智联招聘网站上的 Python 职位信息,可以通过构造特定的搜索 URL 并解析返回的网页内容来实现。以下是具体的步骤和示例代码: 1. **构造请求 URL**:通过分析智联招聘的搜索结果页面,可以发现其搜索请求是基于 GET 方法发送的,因此可以通过修改 URL 参数来获取不同页码的数据。例如,搜索关键词为“Python工程师”,地区为“北京”的基本 URL 结构可能是这样的: ``` https://sou.zhaopin.com/jobs/searchresult.ashx?jl=北京&kw=python工程师&sm=0 ``` 2. **发送 HTTP 请求**:使用 `requests` 库向上述构造好的 URL 发送 GET 请求,并获取响应内容。 3. **解析 HTML 内容**:利用 `BeautifulSoup` 或者 `lxml` 等库解析 HTML 页面,提取所需的信息如职位名称、公司名、薪资范围等。 4. **数据清洗与存储**:对提取的数据进行必要的清洗处理后,可以选择将其保存到文件或者数据库中。 下面是一个简单的代码示例,演示了如何使用 Python 实现以上流程中的部分功能: ```python import requests from bs4 import BeautifulSoup def fetch_zhilian_jobs(keyword, location): base_url = "https://sou.zhaopin.com/jobs/searchresult.ashx" params = { 'jl': location, 'kw': keyword, 'sm': 0 } response = requests.get(base_url, params=params) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') job_listings = soup.find_all('div', class_='jobInfo') for listing in job_listings: title = listing.find('a').get_text(strip=True) company = listing.find('span', class_='companyName').get_text(strip=True) salary = listing.find('span', class_='salary').get_text(strip=True) print(f"职位: {title}, 公司: {company}, 薪资: {salary}") # 示例调用函数 fetch_zhilian_jobs("Python工程师", "北京") ``` 此段代码首先定义了一个函数 `fetch_zhilian_jobs` 接收两个参数:职位关键字和工作地点,然后构建请求参数并发送 GET 请求。接着,它使用 BeautifulSoup 解析返回的 HTML 文档,查找所有包含职位信息的 div 元素,并从中提取出职位名称、公司名称及薪资信息,并打印出来[^5]。 ### 注意事项 - 在实际操作过程中,请确保遵守目标网站的服务条款,尊重 robots.txt 文件规定。 - 对于复杂的动态加载内容,可能需要考虑使用 Selenium 或者 Scrapy-Splash 等工具模拟浏览器行为。 - 数据解析时应仔细检查元素结构变化,因为网站布局可能会更新导致原有选择器失效。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

潜意识^

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

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

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

打赏作者

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

抵扣说明:

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

余额充值