目录
背景
为什么要抓取职位信息
怎么抓取职位信息
代码示例
被反爬怎么办
使用代理IP进行爬取
总结
背景
高考刚结束,马上又到了大学生毕业的时候了,各大厂也开始了一波招工潮了,想知道大厂或竞争对手都招些什么人,有什么需求,于是打算爬点职位信息参考下。
为什么要抓取职位信息
抓取职位信息有多种用途,其中一些常见的用途包括:
1. 潜在求职者分析:可以通过大数据技术分析人才流动趋势,在哪些城市或公司聚集了多少求职者,有助于企业了解市场竞争状况以及不同城市或行业的人才供需情况。
2. 薪资分析:通过职位信息可以获取不同职位的薪资水平,有助于了解行业薪资标准,提高员工福利和薪酬竞争力,吸引人才。
3. 行业趋势分析:通过职位信息可以了解当前所处行业或行业内的热门职位,将来行业的发展趋势和方向,有助于企业制定战略方案和拓展业务。
4. 竞争情报分析:可以了解竞争对手或其他企业的组织架构、员工数量、招聘需求等关键信息,有助于企业了解市场状况和竞争对手的战略规划,提高企业的竞争力。
怎么抓取职位信息
抓取职位信息可以通过网络爬虫技术实现。抓取流程如下:
1. 分析目标网站:首先需要确定目标网站,并观察网站构造和源码,确定需要抓取的职位信息类型和位置。
2. 发送HTTP请求:使用 Python requests 库构造 HTTP 请求,获取页面信息。
3. 解析页面:使用 Python 库 BeautifulSoup 或者正则表达式等工具解析网页。
4. 提取信息:从网页中提取所需职位信息、公司信息及它们的URL等相关信息。
5. 存储信息:将提取到的职位信息进行存储,可以存储在数据库或文件中。
6. 处理反爬:在抓取职位信息时,网站可能会进行反爬措施,需要分析网站反爬机制,采取一定的策略避免被反爬而导致无法获取数据。
需要注意的是,抓取职位信息需要遵守法律法规、网站规则和道德准则,避免抓取到敏感信息或侵犯他人隐私等问题。
代码示例
这里以爬取某勾网职位信息为例,示例代码如下:
import requests
from bs4 import BeautifulSoup
import json
import time
def get_positions(city, keyword=None, page_num=1):
"""获取指定城市和职位关键词的职位信息"""
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.73'
headers = {'User-Agent': user_agent}
url = f'https://www.*****.com/jobs/positionAjax.json?needAddtionalResult=false&city={city}&kd={keyword}&pn={page_num}'
response = requests.get(url, headers=headers)
if response.status_code == 200:
result = json.loads(response.text)
# 解析职位信息
positions = []
for job in result['content']['positionResult']['result']:
position = {}
position['position_name'] = job['positionName'] # 职位名称
position['salary'] = job['salary'] # 薪资
position['company_name'] = job['companyFullName'] # 公司名称
position['work_year'] = job['workYear'] # 工作年限
position['education'] = job['education'] # 学历
position['position_advantage'] = job['positionAdvantage'] # 职位优势
positions.append(position)
return positions
else:
print(f'请求错误,状态码:{response.status_code}')
if __name__ == '__main__':
city = '广州'
keyword = 'Python'
for page_num in range(1, 6):
positions = get_positions(city=city, keyword=keyword, page_num=page_num)
if positions:
for position in positions:
print(position)
# 每爬完一页,就休眠一段时间,避免被反爬
time.sleep(3)
此代码通过分析拉勾网的接口来获取职位信息。可以传入城市名和职位关键词来筛选职位,同时支持分页获取信息。如果想要将职位信息存储在数据库或者文件中,可以将获取到的 positions 写入数据库或文件。相应地,也可以通过增加访问间隔时间、使用代理 IP 等方式来支持反爬。
被反爬怎么办
在爬取职位信息的过程中,如果被目标网站检测到并且反爬,有一些常见的应对措施如下:
1. 降低访问频率:合理减少请求间隔时间,降低对目标网站的访问频率,以防被检测到。
2. 使用代理IP:通过使用代理IP来模拟多个访问来源,降低单个IP被检测到的概率。
3. 更换 User-Agent:可以在请求头中改变 User-Agent 的值,模拟不同的浏览器类型,来提高爬虫的隐匿性。
4. 登陆账号:有些网站对未登录用户的爬取有限制,可以使用网站提供的登陆功能,获取更多数据。
5.对抗反爬:一些情况下,网站的反爬手段比较强大,可以通过一些技术手段绕过反爬机制,例如使用图像识别技术识别验证码,模拟人工操作等。
使用代理IP进行爬取
使用代理IP是绕过反爬限制的有效手段之一。代理IP可以提供多个访问来源,避免对目标网站请求过于集中,同时可以提高访问隐匿性,减少被屏蔽的概率。下面是一个使用代理IP来爬取拉勾网职位信息的示例代码:
import requests
from bs4 import BeautifulSoup
import json
import time
# 设置代理IP列表
proxies = [
{'http': 'http://123.123.123.168:16888', 'https': 'http://123.123.123.168:16888'},
{'http': 'http://123.123.123.168:16888', 'https': 'http://123.123.123.168:16888'},
{'http': 'http://123.123.123.168:16888', 'https': 'http://123.123.123.168:16888'},
# 可以添加更多的代理IP,也可以通过站大爷的API接口源源不断的获取代理IP
]
def get_positions(city, keyword=None, page_num=1, use_proxy=True):
"""获取指定城市和职位关键词的职位信息"""
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.73'
headers = {'User-Agent': user_agent}
url = f'https://www.*****.com/jobs/positionAjax.json?needAddtionalResult=false&city={city}&kd={keyword}&pn={page_num}'
# 使用代理IP访问
if use_proxy:
proxy = random.choice(proxies)
response = requests.get(url, headers=headers, proxies=proxy)
else:
response = requests.get(url, headers=headers)
if response.status_code == 200:
result = json.loads(response.text)
# 解析职位信息
positions = []
for job in result['content']['positionResult']['result']:
position = {}
position['position_name'] = job['positionName'] # 职位名称
position['salary'] = job['salary'] # 薪资
position['company_name'] = job['companyFullName'] # 公司名称
position['work_year'] = job['workYear'] # 工作年限
position['education'] = job['education'] # 学历
position['position_advantage'] = job['positionAdvantage'] # 职位优势
positions.append(position)
return positions
else:
print(f'请求错误,状态码:{response.status_code}')
if __name__ == '__main__':
city = '广州'
keyword = 'Python'
for page_num in range(1, 6):
positions = get_positions(city=city, keyword=keyword, page_num=page_num, use_proxy=True)
if positions:
for position in positions:
print(position)
# 每爬完一页,就休眠一段时间,避免被反爬
time.sleep(3)
此代码通过定义了一个代理IP列表,并使用 `requests` 库的 `proxies` 参数来随机选择代理IP访问目标网站,进而避免单个IP访问过于频繁被目标网站封锁。
需要注意,代理IP的质量和稳定性会直接影响到爬取效果,因此在选择代理IP时需要注意选择稳定性较高的服务商、IP 质量较高的代理IP,比如站大爷代理IP。
总结
在进行职位信息爬取时,需要先确定目标网站,并通过分析页面结构和抓包等方式获取到页面 API 接口。接着,通过发送 HTTP 请求获取页面信息,并使用 BeautifulSoup 或正则表达式等工具解析页面获取所需信息。
在整个爬取过程中,应该注意遵守法律法规和道德准则,避免侵犯他人隐私和抓取敏感信息等问题。
同时,对于反爬机制的应对,可以采取一些策略,如降低访问频率、使用代理 IP、更换 User-Agent 、登陆账号、对抗反爬等方法。选择稳定性较高的代理IP服务商,是一个比较关键的选择,也决定了是否能够顺利进行爬取。