c爬虫抓取网页数据(抓取智联招聘的招聘信息助你换工作成功(组图) )

优采云 发布时间: 2021-12-14 21:35

  c爬虫抓取网页数据(抓取智联招聘的招聘信息助你换工作成功(组图)

)

  对于每个上班族来说,总会有几次工作变动。如何在网上选择自己喜欢的工作?如何提前准备心仪工作的面试?今天我们就来抢夺智联招聘的招聘信息,助您顺利转岗!

  操作平台:Windows

  Python版本:Python3.6

  IDE:崇高的文本

  其他工具:Chrome 浏览器

  1、Web 分析1.1 分析请求地址

  以北京市海淀区python工程师为例进行网页分析。打开智联招聘首页,选择北京地区,在搜索框中输入“python工程师”,点击“搜索职位”:

  

  接下来跳转到搜索结果页面,按“F12”打开开发者工具,然后在“热点区”一栏中选择“海淀”,我们来看看地址栏:

  

  ​

  从地址栏searchresult.ashx?jl=Beijing&kw=pythonengineer&sm=0&isfilter=1&p=1&re=2005的后半部分可以看出,我们必须自己构造地址。接下来,我们需要分析开发者工具,按照如图所示的步骤,找到我们需要的数据:Request Headers和Query String Parameters:

  

  构造请求地址:

  paras = {

'jl': '北京', # 搜索城市

'kw': 'python工程师', # 搜索关键词

'isadv': 0, # 是否打开更详细搜索选项

'isfilter': 1, # 是否对结果过滤

'p': 1, # 页数

're': 2005 # region的缩写,地区,2005代表海淀

}

url = 'https://sou.zhaopin.com/jobs/searchresult.ashx?' + urlencode(paras)

  请求头:

  headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',

'Host': 'sou.zhaopin.com',

'Referer': 'https://www.zhaopin.com/',

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',

'Accept-Encoding': 'gzip, deflate, br',

'Accept-Language': 'zh-CN,zh;q=0.9'

}

  1.2 分析有用的数据

  接下来,我们需要分析有用的数据。我们从搜索结果中需要的数据有:职位名称、公司名称、公司详情页地址、职位月薪:

  

  通过定位网页元素,找到这些项目在HTML文件中的位置,如下图所示:

  

  使用正则表达式提取这四项:

  # 正则表达式进行解析

pattern = re.compile('<a style=.*? target="_blank">(.*?)</a>.*?' # 匹配职位信息

'(.*?).*?' # 匹配公司网址和公司名称

'(.*?)', re.S) # 匹配月薪

# 匹配所有符合条件的内容

items = re.findall(pattern, html)

  注:部分解析出的职位有标注,如下图:

  

  然后解析后,对数据进行处理,去除标签,实现代码如下:

  for item in items:

job_name = item[0]

job_name = job_name.replace('', '')

job_name = job_name.replace('', '')

yield {

'job': job_name,

'website': item[1],

'company': item[2],

'salary': item[3]

}

  2、写入文件

  我们得到的数据,每个位置都有相同的信息项,可以写入数据库,但是本文选择了一个csv文件。以下是百度百科的解释:

  逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。

  由于python内置了对csv文件操作的库函数,非常方便:

  import csv

def write_csv_headers(path, headers):

'''

写入表头

'''

with open(path, 'a', encoding='gb18030', newline='') as f:

f_csv = csv.DictWriter(f, headers)

f_csv.writeheader()

def write_csv_rows(path, headers, rows):

'''

写入行

'''

with open(path, 'a', encoding='gb18030', newline='') as f:

f_csv = csv.DictWriter(f, headers)

f_csv.writerows(rows)

  3、进度显示

  如果你想找到理想的工作,你必须筛选更多的职位。那么我们抓取的数据量一定非常大,几十页,几百页,甚至上千页。那么就必须掌握爬取的进度,才能更可靠。啊,所以我们需要添加一个进度条显示功能。

  本文选择tqdm显示进度,看看效果很酷(图片来源网络):

  

  执行以下命令安装:pip install tqdm。

  简单的例子:

  from tqdm import tqdm

from time import sleep

for i in tqdm(range(1000)):

sleep(0.01)

  4、完整代码

  以上就是对所有函数的分析,完整代码如下:

  #-*- coding: utf-8 -*-

import re

import csv

import requests

from tqdm import tqdm

from urllib.parse import urlencode

from requests.exceptions import RequestException

def get_one_page(city, keyword, region, page):

'''

获取网页html内容并返回

'''

paras = {

'jl': city, # 搜索城市

'kw': keyword, # 搜索关键词

'isadv': 0, # 是否打开更详细搜索选项

'isfilter': 1, # 是否对结果过滤

'p': page, # 页数

're': region # region的缩写,地区,2005代表海淀

}

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',

'Host': 'sou.zhaopin.com',

'Referer': 'https://www.zhaopin.com/',

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',

'Accept-Encoding': 'gzip, deflate, br',

'Accept-Language': 'zh-CN,zh;q=0.9'

}

url = 'https://sou.zhaopin.com/jobs/searchresult.ashx?' + urlencode(paras)

try:

# 获取网页内容,返回html数据

response = requests.get(url, headers=headers)

# 通过状态码判断是否获取成功

if response.status_code == 200:

return response.text

return None

except RequestException as e:

return None

def parse_one_page(html):

'''

解析HTML代码,提取有用信息并返回

'''

# 正则表达式进行解析

pattern = re.compile('<a style=.*? target="_blank">(.*?)</a>.*?' # 匹配职位信息

'(.*?).*?' # 匹配公司网址和公司名称

'(.*?)', re.S) # 匹配月薪

# 匹配所有符合条件的内容

items = re.findall(pattern, html)

for item in items:

job_name = item[0]

job_name = job_name.replace('', '')

job_name = job_name.replace('', '')

yield {

'job': job_name,

'website': item[1],

'company': item[2],

'salary': item[3]

}

def write_csv_file(path, headers, rows):

'''

将表头和行写入csv文件

'''

# 加入encoding防止中文写入报错

# newline参数防止每写入一行都多一个空行

with open(path, 'a', encoding='gb18030', newline='') as f:

f_csv = csv.DictWriter(f, headers)

f_csv.writeheader()

f_csv.writerows(rows)

def write_csv_headers(path, headers):

'''

写入表头

'''

with open(path, 'a', encoding='gb18030', newline='') as f:

f_csv = csv.DictWriter(f, headers)

f_csv.writeheader()

def write_csv_rows(path, headers, rows):

'''

写入行

'''

with open(path, 'a', encoding='gb18030', newline='') as f:

f_csv = csv.DictWriter(f, headers)

f_csv.writerows(rows)

def main(city, keyword, region, pages):

'''

主函数

'''

filename = 'zl_' + city + '_' + keyword + '.csv'

headers = ['job', 'website', 'company', 'salary']

write_csv_headers(filename, headers)

for i in tqdm(range(pages)):

'''

获取该页中所有职位信息,写入csv文件

'''

jobs = []

html = get_one_page(city, keyword, region, i)

items = parse_one_page(html)

for item in items:

jobs.append(item)

write_csv_rows(filename, headers, jobs)

if __name__ == '__main__':

main('北京', 'python工程师', 2005, 10)

  以上代码的执行效果如图:

  

  执行完成后会在同级py文件夹中生成一个名为:zl_Beijing_pythonengineer.csv的文件,打开后效果如下:

  

  这个例子的功能比较简单。它只捕获数据,不分析数据。下次我会捕捉更多信息,分析薪资、岗位技能要求等各种数据,敬请期待!

  欢迎关注公众号:

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线