为了了解目前中国目前各职位的数量、薪资、招聘公司、岗位职责及要求,实现对某一地区人才需求分布的可视化分析,实现高校以及培训机构对人才培养的正向培养,而非做无用之功。
**
请求库:实现 HTTP 请求操作
urllib:一系列用于操作URL的功能。
requests:基于 urllib 编写的,阻塞式 HTTP 请求库,发出一个请求,一直等待服务器响应后,程序才能进行下一步处理。
selenium:自动化测试工具。一个调用浏览器的 driver,通过这个库你可以直接调用浏览器完成某些操作,比如输入验证码。
aiohttp:基于 asyncio 实现的 HTTP 框架。异步操作借助于 async/await 关键字,使用异步库进行数据抓取,可以大大提高效率。
解析库:从网页中提取信息
beautifulsoup:html 和 XML 的解析,从网页中提取信息,同时拥有强大的API和多样解析方式。
pyquery:jQuery 的 Python 实现,能够以 jQuery 的语法来操作解析 HTML 文档,易用性和解析速度都很好。
lxml:支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。
tesserocr:一个 OCR 库,在遇到验证码(图形验证码为主)的时候,可直接用 OCR 进行识别。
存储库:Python 与数据库交互
pymysql:一个纯 Python 实现的 MySQL 客户端操作库。
pymongo:一个用于直接连接 mongodb 数据库进行查询操作的库。
redisdump:一个用于 redis 数据导入/导出的工具。基于 ruby 实现的,因此使用它,需要先安装 Ruby。
爬虫框架
Scrapy:很强大的爬虫框架,可以满足简单的页面爬取(比如可以明确获知url pattern的情况)。用这个框架可以轻松爬下来如亚马逊商品信息之类的数据。但是对于稍微复杂一点的页面,如 weibo 的页面信息,这个框架就满足不了需求了。
Crawley:高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为 JSON、XML 等。
Portia:可视化爬取网页内容。
newspaper:提取新闻、文章以及内容分析。
python-goose:java 写的文章提取工具。
cola:一个分布式爬虫框架。项目整体设计有点糟,模块间耦合度较高。
Web 框架库
flask:轻量级的 web 服务程序,简单,易用,灵活,主要来做一些 API 服务。做代理时可能会用到。
django:一个 web 服务器框架,提供了一个完整的后台管理,引擎、接口等,使用它可做一个完整网站。
代码如下:
import re
import time
import requests
from lxml import etree
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
start_time = time.time() # 开始时间
f = open('job1.csv', 'w', encoding='utf-8')
# 写入标题
list = ['职位名称', '薪资水平', '公司名称', '公司性质', '所属行业', '职能类别', '地区', '经验要求', '学历要求', '招聘人数','发布日期','职位信息','备注']
for a in list:
f.write(a)
f.write(',')
f.write('\n')
for i in range(1, 1000):
print("正在爬取第" + str(i) + "页数据")
url0 = "https://search.51job.com/list/120000,000000,0000,00,2,99,+,2,"
url_end = ".html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare="
url = url0 + str(i) + url_end
res = requests.get(url=url, headers=headers)
res.encoding = 'gbk'
p = res.text
ex = r'job_href\":(.*?),' # 获取text文档后找到网址元素进行正则提取
p1 = re.findall(ex, p) # re.findall(匹配规则,所有内容)
# print(res.text)
for a in range(len(p1)):
url = p1[a][1:-1].replace("\\", "") # 将\\替换消失
page = requests.get(url=url, headers=headers)
page.encoding = 'gbk'
tree = etree.HTML(page.text) # 解析
# etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象。作为_Element对象,可以方便的使用getparent()、remove()、xpath()等方法。
# 如果想通过xpath获取html源码中的内容,就要先将html源码转换成_Element对象,然后再使用xpath()方法进行解析。
# 获取岗位标题
title = tree.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/h1/text()')[0:1]
if len(title) != 0:
f.write(title[0])
else:
f.write('NULL')
f.write(',')
# 获取薪资水平
salary = tree.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/strong/text()')[0:1]
# print(salary)
if len(salary) != 0:
f.write(salary[0])
else:
f.write('NULL')
f.write(',')
# 获取公司名称
company = tree.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[1]/a[1]/text()')[0:1]
if len(company) != 0:
f.write(company[0])
else:
f.write('NULL')
f.write(',')
# 获取公司性质
nature = tree.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[1]/text()')[0:1]
if len(nature) != 0:
f.write(nature[0])
else:
f.write('NULL')
f.write(',')
# 获取所属行业
industry = tree.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[3]/a/text()')[0:1]
if len(industry) != 0:
f.write(industry[0])
else:
f.write('NULL')
f.write(',')
# 获取职能类别
category = tree.xpath('/html/body/div[3]/div[2]/div[3]/div[1]/div/div[1]/p[1]/a/text()')[0:1]
# print(category)
if len(category) != 0:
f.write(category[0])
else:
f.write('NULL')
f.write(',')
# 获取工作地区
pos = tree.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/@title')
# print(pos)
for a in pos:
if a is not None:
# 获取位置
position = a.split(r'|')[0].replace(u'\xa0', u'') # 字符串前加u,防止中文乱码
f.write(position)
f.write(',')
# 获取所需经验
year = a.split(r'|')[1].replace(u'\xa0', u'')
f.write(year)
f.write(',')
# 获取学历要求
degree = a.split(r'|')[2].replace(u'\xa0', u'')
f.write(degree)
f.write(',')
# 获取招聘人数
people = a.split(r'|')[-2].replace(u'\xa0', u'')
f.write(people)
f.write(',')
# 获取发布日期
day = a.split(r'|')[-1].replace(u'\xa0', u'')
f.write(day)
f.write(',')
# 获取岗位描述与任职要求
lst1 = tree.xpath('//div[@class="bmsg job_msg inbox"]//text()')
a = []
for i in lst1:
de1 = i.replace(u'\xa0', u"")
if len(de1) != 0:
a.append(de1)
work = "".join(a).replace(" ", "").replace(u"\r\n", ",").replace(",", ",") # 去掉空白、换行和英文逗号
f.write(work)
f.write(',')
if len(pos) != 0:
f.write(pos[0])
else:
f.write('NULL')
f.write('\n')
time.sleep(0.5)
f.close()
end_time = time.time()
print("爬取完毕!爬取时长%s秒" % (end_time - start_time))
还可以用Spider、urllib、BeautifulSoup等库实现爬取,在这就不一一展示了。