python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能

当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。

本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请求参数、请求方式和响应内容。如图所示:

从图上可以看到,我们将搜索关键字添加设置python,搜索地区设为广州。浏览器的地址为:

现在确定了搜索关键字和搜索区域后,我们还需要确定页数,因为搜索出来的结果肯定是进行分页处理。以搜索关键字为python,搜索地区为广州,点击第二页,其请求链接如下:

# 第一页

https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,1.html

# 第二页

https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,2.html

确定请求链接后,我们在分析该请求的响应内容,从响应内容中获取所需的数据内容,如图所示:

从图上可知,我们需要爬取职位的岗位要求和任职要求的数据,因此在当前页面中,我们需要获取职位的URL地址。

根据上述分析,功能代码如下:

import requests

from bs4 import BeautifulSoup

# 函数参数分别为城市编号、关键词和循环的页数

def get_url(cityCode, keyWord, pageNum):

headers = {

'Host':'search.51job.com',

'Upgrade-Insecure-Requests': '1',

'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36'

}

temp_list = []

for i in range(int(pageNum)):

url = 'https://search.51job.com/list/'+cityCode+',000000,0000,00,9,99,'+keyWord+',2,'+str(i+1)+'.html'

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

soup = BeautifulSoup(r.content.decode('gbk'),'html5lib')

find_div = soup.find_all('div',class_='el')

# 获取职位的URL

for j in find_div:

find_href = j.find('a')

if 'https://jobs.51job.com' in str(find_href):

temp_list.append(find_href['href'])

return temp_list

得到职位的URL之后,接下来分析职位的信息页面。在职位信息页,分别获取职位信息和任职要求,网页分析如图所示:

图上的响应内容中,职位信息是在HTML的div标签,属性class为bmsg job_msg inbox,并且属性值是唯一的,因此可以通过该标签进行定位获取数据。其代码功能如下:

# 获取职位信息

def get_data(job_url):

headers = {

'Host': 'jobs.51job.com',

'Upgrade-Insecure-Requests': '1',

'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36'

}

# 遍历职位url列表,获取每个职位的职位信息

for url in job_url:

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

soup = BeautifulSoup(r.content.decode('gbk'), 'html5lib')

find_job = soup.find('div', class_='bmsg job_msg inbox').find_all('p')

temp_list = []

# 获取职位信息

for k in find_job:

# 简单的数据清洗

if not ':' in str(k) and not ':' in str(k) and k.getText():

if '、' in k.getText():

text = k.getText().split('、')[1].strip()

else:

text = k.getText().strip()

temp_list.append(text)

# 将数据写入CSV文件

if ''.join(temp_list).strip():

f = open('text.csv', 'a', newline='', encoding='utf-8')

writer = csv.writer(f)

writer.writerow([''.join(temp_list)])

f.close()

我们将两个函数get_url和get_data写在spider.py文件,代码如下:

import requests

from bs4 import BeautifulSoup

import csv

# 函数参数分别为城市编号、关键词和循环的页数

def get_url(cityCode, keyWord, pageNum):

headers = {

'Host':'search.51job.com',

'Upgrade-Insecure-Requests': '1',

'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36'

}

temp_list = []

for i in range(int(pageNum)):

url = 'https://search.51job.com/list/'+cityCode+',000000,0000,00,9,99,'+keyWord+',2,'+str(i+1)+'.html'

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

soup = BeautifulSoup(r.content.decode('gbk'),'html5lib')

find_div = soup.find_all('div',class_='el')

# 获取职位的URL

for j in find_div:

find_href = j.find('a')

if 'https://jobs.51job.com' in str(find_href):

temp_list.append(find_href['href'])

return temp_list

# 获取职位信息

def get_data(job_url):

headers = {

'Host': 'jobs.51job.com',

'Upgrade-Insecure-Requests': '1',

'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36'

}

# 遍历职位url列表,获取每个职位的职位信息

for url in job_url:

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

soup = BeautifulSoup(r.content.decode('gbk'), 'html5lib')

find_job = soup.find('div', class_='bmsg job_msg inbox').find_all('p')

temp_list = []

# 获取职位信息

for k in find_job:

# 简单的数据清洗

if not ':' in str(k) and not ':' in str(k) and k.getText():

if '、' in k.getText():

text = k.getText().split('、')[1].strip()

else:

text = k.getText().strip()

temp_list.append(text)

# 将数据写入CSV文件

if ''.join(temp_list).strip():

f = open('text.csv', 'a', newline='', encoding='utf-8')

writer = csv.writer(f)

writer.writerow([''.join(temp_list)])

f.close()

if __name__ == '__main__':

cityCode = '030200'

keyWord = 'python'

pageNum = 2

job_url = get_url(cityCode, keyWord, pageNum)

get_data(job_url)

本例子只获取关键字为python,搜索区域为广州,页数为两页的职位信息。(如果读者想爬取多地方多关键词的职位信息,可自行修改)。代码运行后,在文件spider.py同一目录下自动生成text.csv文件,文件内容如下:

现在有了职位信息的数据后,下一步是对这些数据进行分析。数据分析我们采用人工智能的自然语言处理,根据提供的关键词来计算相关词列表。首先对数据进行分词处理,将数据划分为词语。中文分词建议使用jieba模块,分词的效果相当较高,在分词之前,还需要对数据进行清洗,清洗数据中一些标点符号,如下所示:

import csv,re

import jieba

# 数据清洗并分词

#Python学习交流群:1004391443

csv_reader=csv.reader(open('text.csv',encoding='utf-8'))

seg_list = []

for row in csv_reader:

temp_list = jieba.cut(row[0], cut_all=False)

results = re.sub('[()::?“”;.~?/《》【】,,。!()·、.\d ]+', ' ', ' '.join(temp_list))

seg_list.append(results)

# 将分词写入文件

f = open('data.txt','w',encoding='utf-8')

f.write(' '.join(seg_list))

f.close()

数据清洗完毕会自动保存在文件data.txt,打开data.txt查看数据内容,如图所示:

数据清洗完成后,最后一步就是建模,我们使用gensim模块实现,由word2vec函数方法实现建模,其功能代码如下:

# 通过word2vec计算相关词列表

from gensim import models

# 建模

sentences = models.word2vec.LineSentence('data.txt')

model = models.word2vec.Word2Vec(sentences, size=1000, window=25, min_count=5, workers=4)

# 计算前50个与python相关的词列表

sim = model.wv.most_similar('python', topn=50)

for s in sim:

print("word:%s,similar:%s " %(s[0],s[1]))

文件analysis.py的代码如下:

import csv,re

import jieba

from gensim import models

# 数据清洗并分词

csv_reader=csv.reader(open('text.csv',encoding='utf-8'))

seg_list = []

for row in csv_reader:

temp_list = jieba.cut(row[0], cut_all=False)

results = re.sub('[()::?“”;.~?/《》【】,,。!()·、.\d ]+', ' ', ' '.join(temp_list))

seg_list.append(results)

# 将分词写入文件

f = open('data.txt','w',encoding='utf-8')

f.write(' '.join(seg_list))

f.close()

# 通过word2vec计算相关词列表

# 建模

sentences = models.word2vec.LineSentence('data.txt')

model = models.word2vec.Word2Vec(sentences, size=1000, window=25, min_count=5, workers=4)

# 计算前50个与python相关的词列表

sim = model.wv.most_similar('python', topn=50)

for s in sim:

print("word:%s,similar:%s " %(s[0],s[1]))

输出结果如图所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值