Python爬取51jobs之数据清洗(3)

爬虫实战:解析51job招聘网页
本文介绍如何使用Python的requests和BeautifulSoup库从51job网站抓取招聘数据,包括公司名称、职位信息和月薪。通过正则表达式和字符串处理技巧,详细展示了数据清洗过程。

 

前面已经用get_webpage方法获取网站,下面说一说如何从网站信息中过滤出我想要的信息(招聘公司,招聘信息,薪水)。

以一个公司招聘网站为例子,

ur=‘https://jobs.51job.com/hangzhou-jgq/104504900.html?s=01&t=0’

’我们要获取这3个地方的文本信息

首先导入requests模块,写上请求头

import requests
import re
from bs4 import BeautifulSoup


def data_cleaning():
    user_agent = 'Mozilla/4.0 (compatible;MSIE 5.5; Windows NT)'
    headers = {
        'User-Agent': user_agent
    }
    url = "https://jobs.51job.com/hangzhou-jgq/104504900.html?s=01&t=0"
    r = requests.get(url, headers)
    soup = BeautifulSoup(r.text, 'html.parser', exclude_encodings="utf-8")

上面都是爬虫基础的,随便百度一下就行,简单来说,soup就是你在网页按F12出来的HTML代码。

接着在利用正则,BS4模块获取目的信息

整理如下:

def data_cleaning():
    ....  # 省略之前写的
    # 1,公司名称
    sname = soup.find_all(class_='catn')[0]['title']  
    # 2,职位信息
    directory = soup.find_all(class_='bmsg job_msg inbox')[0]  # 返回一个<class 'bs4.element.Tag'>
    # TypeError: 'NoneType' object is not callable
    job_datas = str(directory).replace("\n", "")
    pattern = re.compile('<div class="bmsg job_msg inbox">(.*?)<div', re.S)
    job_data = re.findall(pattern, job_datas)
    job_data = job_data[0].replace('<p>', '').replace('</p>','\n')
    # 3,月薪
    job_salary = soup.find_all(class_='cn')[0].strong.text
    return  sname,job_data,job_salary

值得注意的是:

job_datas = str(directory).replace("\n", "")

首先:directory = soup.find_all(class_='bmsg job_msg inbox')[0]返回的是一个元素,到底在Python里面算什么(NoneType),反正不是字符串,所以首先要将directory转换为字符串

然后directory其实还有很多换行符“/n”在你调试的时候并不会显示,但你在正则匹配的时候它又确确实实存在,所以为了方便消除换行符,用字符串的replace方法

后续只要将sname,job_data,job_salary存入MySQL数据库就算基本OK了。

<think>嗯,用户想用Python爬取招聘网站上的数据科学岗位信息。首先,我得确定用户的需求是什么。他们可能需要收集职位名称、公司、薪资、地点、要求等信息,用于数据分析或者求职参考。接下来,我需要考虑如何选择合适的工具和方法。 首先,常用的Python爬虫库有requests和BeautifulSoup,这两个库适合处理静态页面。不过,很多招聘网站比如拉勾网可能用了动态加载,这时候可能需要Selenium或者Scrapy来处理。用户提到的引用里也提到了这些库,比如引用[2]提到requests、BeautifulSoup、Selenium和Scrapy,所以可能需要结合这些工具。然后,分析目标网站的结构是关键。用户需要确定具体爬哪个网站,比如51job、拉勾网等。不同网站的反爬机制不同,比如引用[4]提到拉勾网使用POST请求,表单数据随页数变化,可能需要模拟表单提交或者处理动态内容。而引用[5]展示了51job的URL构造方法,通过改变页码来获取不同页的数据,这可能相对简单一些。接下来,编写爬虫的步骤大致包括发送请求、解析内容、存储数据。对于静态页面,用requests获取HTML,再用BeautifulSoup解析。动态内容可能需要Selenium模拟浏览器操作。例如,引用[5]中的代码用requests和BeautifulSoup提取链接,而引用[4]提到拉勾网可能需要用PyCharm自行编写程序处理POST请求。还需要注意反爬措施,比如设置请求头、使用代理、随机延迟等。引用[5]里用了time.sleep(random.randint(5,30))来避免被封IP,这也是常见的做法。另外,数据存储可以用Pandas保存到CSV或数据库,方便后续分析。 用户可能遇到的问题包括网站结构变化、反爬机制、数据解析错误等。需要提醒他们定期检查爬虫的稳定性,并处理可能的异常。此外,法律和道德问题也很重要,确保不违反网站的服务条款,合理使用数据。 最后,生成相关问题需要考虑用户可能的后续需求,比如数据处理、可视化、分析岗位趋势等。引用[1]和[2]都提到了数据可视化和分析,所以相关问题可以围绕这些方面展开。</think>### 分步指南:用Python爬取数据科学岗位信息 --- #### 一、准备工作 1. **目标网站选择** - 优先选择反爬机制较弱的网站(如51job、智联招聘)或提供API的网站[^5] - 动态网站(如拉勾网)需用Selenium或Scrapy处理[^4] 2. **安装依赖库** ```bash pip install requests beautifulsoup4 pandas selenium scrapy ``` --- #### 二、爬取流程 ##### 1. 静态页面处理(以51job为例) **步骤1:构造URL** 通过分析页面规律生成带关键词的URL,例如: ```python keyword = "数据科学" url = f&#39;http://search.51job.com/jobsearch/search_result.php?keyword={keyword}&curr_page={page_num}&#39; ``` **步骤2:发送请求并解析** 使用`requests`获取HTML,`BeautifulSoup`提取字段: ```python import requests from bs4 import BeautifulSoup response = requests.get(url) soup = BeautifulSoup(response.content, "html.parser") jobs = soup.find_all(&#39;div&#39;, class_=&#39;j_joblist&#39;) ``` **步骤3:提取关键字段** ```python for job in jobs: title = job.find(&#39;a&#39;, class_=&#39;title&#39;).text.strip() company = job.find(&#39;a&#39;, class_=&#39;company_name&#39;).text.strip() salary = job.find(&#39;span&#39;, class_=&#39;sal&#39;).text.strip() ``` ##### 2. 动态页面处理(以拉勾网为例) 使用Selenium模拟浏览器操作: ```python from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.lagou.com") # 输入关键词并点击搜索 driver.find_element_by_id("search_input").send_keys("数据科学") driver.find_element_by_id("search_button").click() ``` ##### 3. 反爬策略 - 添加随机延迟:`time.sleep(random.randint(3, 10))`[^5] - 设置请求头伪装浏览器: ```python headers = { &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36&#39; } ``` --- #### 三、数据存储 将数据保存为CSV文件: ```python import pandas as pd df = pd.DataFrame(job_list) df.to_csv(&#39;data_science_jobs.csv&#39;, index=False, encoding=&#39;utf_8_sig&#39;) ``` --- #### 四、注意事项 1. **法律合规性** - 遵守网站`robots.txt`协议 - 控制请求频率避免封IP[^4] 2. **数据清洗** - 使用正则表达式处理薪资范围(如`\d+-\d+万/月`) - 统一城市名称格式(如“北京” vs “北京市”) ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值