【转】Python用数据说明程序员需要掌握的技能
https://blog.csdn.net/HuangZhang_123/article/details/80497951

当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。
本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请求参数、请求方式和响应内容。如图所示:

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

https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=
  • 1

由请求链接的格式分析可知,该请求为GET请求,并且带有多个请求参数。为了简化请求参数,我们在浏览器上依次删除请求参数并访问删除后的请求链接,对比删除之前与删除之后的网页变化。最后请求链接的优化如下:

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

从优化后的请求链接可以看到,搜索关键字和搜索区域是隐藏在请求链接的某个位置中。搜索关键字的位置是直观可以看到的,而搜索区域需要进行分析。我们将区域改为上海,其请求链接如下:

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

通过对比发现,搜索区域030200代表广州,020000代表上海。那么问题来了,如果我要切换其他城市,那怎样获取该城市的编号?
针对这个问题,首先从上述的编号分析其特性,发现编号不存规律性,那么应该是由网站自行定义的。因此可以在浏览器的开发者工具下查找相关的请求信息,最后在js下查到以下信息,如图所示:

现在确定了搜索关键字和搜索区域后,我们还需要确定页数,因为搜索出来的结果肯定是进行分页处理。以搜索关键字为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
  • 1
  • 2
  • 3
  • 4

对比发现,我们可确定页数的位置,最终,请求链接的地址修改如下:

# 变量cityCode是城市编号
# 变量keyWord是搜索关键词
# 变量pageNum是搜索页数
'https://search.51job.com/list/'+cityCode+',000000,0000,00,9,99,'+keyWord+',2,'+pageNum+'.html'
  • 1
  • 2
  • 3
  • 4

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

从图上可知,我们需要爬取职位的岗位要求和任职要求的数据,因此在当前页面中,我们需要获取职位的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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

得到职位的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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

我们将两个函数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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

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


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

import csv,re
import jieba
# 数据清洗并分词
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

数据清洗完毕会自动保存在文件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]))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

我们将上述的代码写在analysis.py,文件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]))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

运行analysis.py,输出结果如图所示:

从结果可以看到,要作为一名合格的Python程序员,首先主要掌握Django和scrapy两大框架,selenium是自动化测试技术;数据库以MySql数据库为主,掌握sql语句不在话下;掌握memcached缓存系统,linux操作,计算机TCP协议;最后还要涉猎Java,C和Nodejs等一些目前主流开发语言等。

【转】Python用数据说明程序员需要掌握的技能的更多相关文章

  1. 工作了3年的JAVA程序员应该具备什么技能?(zhuan)

    http://www.500d.me/article/5441.html **************************************** 来源:五百丁 作者:LZ2016-03-18 ...

  2. 工作了3年的JAVA程序员应该具备什么技能?(转)

    工作了3年的JAVA程序员应该具备什么技能? 因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结,因此有了这篇文章.这篇文章大部分内容都是面向整个程序员群体的,当然因为LZ本身是做Java开发 ...

  3. 一名3年工作经验的java程序员应该具备的技能

    一名3年工作经验的Java程序员应该具备的技能,这可能是Java程序员们比较关心的内容.我这里要说明一下,以下列举的内容不是都要会的东西—-但是如果你掌握得越多,最终能得到的评价.拿到的薪水势必也越高 ...

  4. 4-6年经验左右、优秀的 Java 程序员应该具备的技能

    4-6年经验左右.优秀的 Java 程序员应该具备的技能有哪些,按“专业技能”和“项目”两块,包括但不限于以下内容. 专业节能方面 基础:JDK 常用类的原理.源码.使用场景. 设计模式:常用几种的原 ...

  5. .NET WEB程序员需要掌握的技能

    本来这个是我给我们公司入职的新人做一个参考,由于 @张善友 老师在他的微信号转了我的这篇文章<<.Net WEB 程序员需要掌握的技能>>,很多人觉得比较有用,说是看了后知道一 ...

  6. sql数据黑马程序员——SQL入门

    最近研究sql数据,稍微总结一下,以后继续补充: ---------------------- ASP.Net+Android+IO开辟S..Net培训.等待与您交流! --------------- ...

  7. 【软件测试】Python自动化软件测试算是程序员吗?

    今天早上一觉醒来,突然萌生一个念头,[软件测试]软件测试算是程序员吗?左思右想,总感觉哪里不对.做了这么久的软件测试,还真没深究过这个问题.     基于,内事问百度的准则: 结果……     我刚发 ...

  8. kotlin和python哪个好!程序员怎样优雅度过35岁中年危机?满满干货指导

    导语 学历永远是横在我们进人大厂的一道门槛,好像无论怎么努力,总能被那些985,211 按在地上摩擦! 不仅要被"他们"看不起,在HR挑选简历,学历这块就直接被刷下去了,连证明自己 ...

  9. 「编程羽录」上线,程序员必备的这些技能你能get到嘛?

    大家好,我是小羽. 好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章. 会为大家提供一些技术栈之外,程序员还需要的其他方面硬核知识,做到全 ...

随机推荐

  1. 10款Mac上程序员装机必备的开发工具推荐和下载

    10款Mac上程序员装机必备的开发工具推荐和下载 使用Mac的用户主要有两大类:设计师和程序员,为各位程序员童鞋推荐10个Mac上非常棒的开发工具和辅助工具,分享软件专题[10款Mac上程序员装机必备 ...

  2. ssm框架中从controller传值给jsp的方式

    第一种方式是 通过session 第二种如下: 如何将controller层值传递到JSP页面 @RequestMapping(value="/result",method=Req ...

  3. bzoj2957 奥妙重重的线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树的query和update竟然还可以结合起来用! 题意:小A的楼房外有一大片施工工地, ...

  4. Mac下显示网页全屏快捷键

    control+command+F mac下谷歌浏览器全屏时隐藏头部:(隐藏标签页和地址栏) command+shift+B

  5. HDU 5984 数学期望

    对长为L的棒子随机取一点分割两部分,抛弃左边一部分,重复过程,直到长度小于d,问操作次数的期望. 区域赛的题,比较基础的概率论,我记得教材上有道很像的题,对1/len积分,$ln(L)-ln(d)+1 ...

  6. Git与GitHub学习笔记(七)Windows 配置Github ssh key

    前言 SSH是建立在应用层和传输层基础上的安全协议,其目的是专为远程登录会话和其他网络服务提供安全性的保障,用过SSH远程登录的人都比较熟悉,可以认为SSH是一种安全的Shell.SSH登录是需要用户 ...

  7. [Android] Android 常见第三方库汇总地址

    Android 常见第三方库汇总地址 https://github.com/wasabeef/awesome-android-libraries List of Android Libraries T ...

  8. Elasticsearch入门之从零开始安装ik分词器

    起因 需要在ES中使用聚合进行统计分析,但是聚合字段值为中文,ES的默认分词器对于中文支持非常不友好:会把完整的中文词语拆分为一系列独立的汉字进行聚合,显然这并不是我的初衷.我们来看个实例: POST ...

  9. 二.LinkedList原理及实现学习总结

    一.LinkedList实现原理概述 LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同.LinkedList 是基于链表实现的(通过名字也能 ...

  10. Xampp PHPStorm XDebug配置

    (1)https://xdebug.org/download.php 下载当前Xampp对应的XDebug版本. (2)将该dll放入C:\xampp\php\ext (3)修改Control Pan ...