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

优采云 发布时间: 2022-02-20 16:02

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

)

  每个上班族都要换几次工作,那么如何在网上找到自己喜欢的工作呢?如何提前准备理想工作的面试?今天,就让我们一起来抢夺智联招聘的招聘信息,助你转业成功!

  操作平台:Windows

  Python版本:Python3.6

  IDE:崇高文本

  其他工具:Chrome浏览器

  1、网页分析1.1 分析请求地址

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

  

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

  

  ​

  从地址栏的后半部分,searchresult.ashx?jl=Beijing&kw=python Engineer&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(&#39;<a style=.*? target="_blank">(.*?)</a>.*?&#39; # 匹配职位信息

&#39;(.*?).*?&#39; # 匹配公司网址和公司名称

&#39;(.*?)&#39;, re.S) # 匹配月薪

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

items = re.findall(pattern, html)

  注意:部分解析出来的作业名有标签,如下图所示:

  

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

  for item in items:

job_name = item[0]

job_name = job_name.replace(&#39;&#39;, &#39;&#39;)

job_name = job_name.replace(&#39;&#39;, &#39;&#39;)

yield {

&#39;job&#39;: job_name,

&#39;website&#39;: item[1],

&#39;company&#39;: item[2],

&#39;salary&#39;: item[3]

}

  2、写入文件

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

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

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

  import csv

def write_csv_headers(path, headers):

&#39;&#39;&#39;

写入表头

&#39;&#39;&#39;

with open(path, &#39;a&#39;, encoding=&#39;gb18030&#39;, newline=&#39;&#39;) as f:

f_csv = csv.DictWriter(f, headers)

f_csv.writeheader()

def write_csv_rows(path, headers, rows):

&#39;&#39;&#39;

写入行

&#39;&#39;&#39;

with open(path, &#39;a&#39;, encoding=&#39;gb18030&#39;, newline=&#39;&#39;) 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):

&#39;&#39;&#39;

获取网页html内容并返回

&#39;&#39;&#39;

paras = {

&#39;jl&#39;: city, # 搜索城市

&#39;kw&#39;: keyword, # 搜索关键词

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

&#39;isfilter&#39;: 1, # 是否对结果过滤

&#39;p&#39;: page, # 页数

&#39;re&#39;: region # region的缩写,地区,2005代表海淀

}

headers = {

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

&#39;Host&#39;: &#39;sou.zhaopin.com&#39;,

&#39;Referer&#39;: &#39;https://www.zhaopin.com/&#39;,

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

&#39;Accept-Encoding&#39;: &#39;gzip, deflate, br&#39;,

&#39;Accept-Language&#39;: &#39;zh-CN,zh;q=0.9&#39;

}

url = &#39;https://sou.zhaopin.com/jobs/searchresult.ashx?&#39; + 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):

&#39;&#39;&#39;

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

&#39;&#39;&#39;

# 正则表达式进行解析

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

&#39;(.*?).*?&#39; # 匹配公司网址和公司名称

&#39;(.*?)&#39;, re.S) # 匹配月薪

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

items = re.findall(pattern, html)

for item in items:

job_name = item[0]

job_name = job_name.replace(&#39;&#39;, &#39;&#39;)

job_name = job_name.replace(&#39;&#39;, &#39;&#39;)

yield {

&#39;job&#39;: job_name,

&#39;website&#39;: item[1],

&#39;company&#39;: item[2],

&#39;salary&#39;: item[3]

}

def write_csv_file(path, headers, rows):

&#39;&#39;&#39;

将表头和行写入csv文件

&#39;&#39;&#39;

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

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

with open(path, &#39;a&#39;, encoding=&#39;gb18030&#39;, newline=&#39;&#39;) as f:

f_csv = csv.DictWriter(f, headers)

f_csv.writeheader()

f_csv.writerows(rows)

def write_csv_headers(path, headers):

&#39;&#39;&#39;

写入表头

&#39;&#39;&#39;

with open(path, &#39;a&#39;, encoding=&#39;gb18030&#39;, newline=&#39;&#39;) as f:

f_csv = csv.DictWriter(f, headers)

f_csv.writeheader()

def write_csv_rows(path, headers, rows):

&#39;&#39;&#39;

写入行

&#39;&#39;&#39;

with open(path, &#39;a&#39;, encoding=&#39;gb18030&#39;, newline=&#39;&#39;) as f:

f_csv = csv.DictWriter(f, headers)

f_csv.writerows(rows)

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

&#39;&#39;&#39;

主函数

&#39;&#39;&#39;

filename = &#39;zl_&#39; + city + &#39;_&#39; + keyword + &#39;.csv&#39;

headers = [&#39;job&#39;, &#39;website&#39;, &#39;company&#39;, &#39;salary&#39;]

write_csv_headers(filename, headers)

for i in tqdm(range(pages)):

&#39;&#39;&#39;

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

&#39;&#39;&#39;

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__ == &#39;__main__&#39;:

main(&#39;北京&#39;, &#39;python工程师&#39;, 2005, 10)

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

  

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

  

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

  欢迎关注公众号:

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线