dragou网的API和项目案例数据采集
优采云 发布时间: 2020-08-07 16:00文章目录
一个. API
定义
API(应用程序编程接口,应用程序编程接口)是一些预定义的功能,或指软件系统不同组件之间的协议. 目的是使应用程序和开发人员能够访问基于某些软件或硬件的一组例程,而不必访问原创代码或了解内部工作机制的细节.
使用方法
API使用一组非常标准的规则来生成数据,并且生成的数据以非常标准的方式进行组织. 由于这些规则非常标准,因此一些简单的基本规则易于学习,因此您可以快速掌握API的用法. 但并非所有API都易于使用. 有些API有很多规则,而且非常复杂,因此您可以在使用前查看API的相关帮助文档
API验证
1)有些简单的操作不需要验证. 是免费的API
2)大多数API都需要用户提交和验证. 提交验证的主要目的是计算API调用的费用,这是一种常见的付费API. 例如: 图灵的聊天机器人
2. 拖动网项目案例数据采集(一)需求分析
通过数据采集,获取对拉沟发布的专业职位的需求分析.
(2)数据分析和实验结果首先分析网站的详细信息页面(此时关键字使用python). 在真实的请求URL中,网页将返回一个JSON字符串,我们需要解析该JSON字符串. 在页面上获取信息. 通过更改表单数据中pn的值来控制翻页. 从页面的详细信息页面,我们需要获取诸如“职务”,“职务说明”,“职务要求”等信息.
1)首先,我们请求标头信息
我们需要构造请求标头的标头信息. 如果未在此处构建,则很容易被网站识别为爬虫,因此拒绝了我们的请求
2)表单信息
发送POST请求时需要包括的表单信息(表单数据),需要解析的页码和搜索关键字
3)返回JSON数据
我们可以通过网页找到需要的信息,这些信息随时都在-> positionResult->结果中,其中收录工作地点,职位信息,公司名称等. 这些正是我们所需要的数据.
相关代码:
在配置文件中: (此文件的作用是: 当您以后要爬网其他类别或修改相关参数时,可以直接在文件中对其进行修改)
from fake_useragent import UserAgent
import requests
Host = 'www.lagou.com'
Origin = 'https://www.lagou.com'
Refer = 'https://www.lagou.com/jobs/list_python'
Connection = 'keep-alive'
Accept = 'application/json,text/javascript,*/*; q=0.01'
ua = UserAgent(verify_ssl=False)
ThreadCount = 50
csv_filename = 'filename.csv'
pages = 20
keyword = "python"
分析页面的核心代码:
#需要导入的模块
import time
import pandas as pd
import requests
from config import *
import logging
from concurrent.futures import ThreadPoolExecutor
import pprint
# 灵活配置日志级别,日志格式,输出位置
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='lagou.log',
filemode='w')
# 获取PositionID所在的页面,返回的是json数据
def getPositionIDPage(url_start, url_parse, page=1, kd='python'):
# 构造请求头(headers)
headers = {'User-Agent': ua.random,
'Host': Host,
'Origin': Origin,
'Referer': Refer,
'Connection': Connection,
'Accept': Accept,
'proxies': proxy}
# 构造表单
data = {
'first': False,
'pn': str(page),
'kd': kd
}
try:
# requests库里面的session对象能够帮助我们跨请求保持某些参数
# 也会在同一个session实例发出的所有请求之间保持cookies
# 创建一个session对象
session = requests.Session()
# 用session对象发出get 请求,设置cookies
session.get(url_start, headers=headers, timeout=3)
cookie = session.cookies
# 用session对象发出另一个请求post,获取cookies,返回响应信息
response = session.post(url=url_parse,
headers=headers,
data=data)
time.sleep(1)
# 响应状态码是4XX客户端错误,5XX 服务端响应错误,抛出异常
response.raise_for_status()
response.encoding = response.apparent_encoding
except Exception as e:
logging.error("页面" + url_parse + "爬取失败:", e)
else:
logging.info("页面" + url_parse + "爬取成功" + str(response.status_code))
return response.json()
运行测试:
if __name__ == '__main__':
url_start = 'https://www.lagou.com/jobs/list_%s' % (keyword)
url_parse = 'https://www.lagou.com/jobs/positionAjax.json?px=default&needAddtionalResult=false'
content = getPositionIDPage(url_start, url_parse, page=page, kd=keyword)
pprint(content)
达到的效果:
3. 抓取相关的职位信息
获取所需职位的标签,招聘信息的每一页上都会有一个标签
positions = html['content']['positionResult']['result']
pprint.pprint(html)
df = pd.DataFrame(positions)
4. 商店信息
当我们找到所需的页面信息并对其进行爬网时,我们会将爬网的职位信息存储在一个csv文件中
def save_as_csv():
#开启进程池
with ThreadPoolExecutor(ThreadCount) as pool:
#map方法: 可迭代对象传入函数是从前到后逐个提取元素,并且将结果依次保存在results中。
results = pool.map(task, range(1, pages + 1))
# total_df:拼接所有的信息,(axis=0,代表列拼接)
total_df = pd.concat(results, axis=0)
total_df.to_csv(csv_filename, sep=',', header=True, index=False)
logging.info("文件%s 存储成功" % (csv_filename))
return total_df
注意: 这里使用线程池方法来解析和保存
达到的效果:
数据分析
成功抓取后,我们可以分析所拥有的数据并查看每个位置的统计信息
import pandas as pd
from config import *
import matplotlib.pyplot as plt
import matplotlib
# 修改配置中文字字体和大小的修改
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['font.size'] = 12
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv(csv_filename, encoding='utf-8')
def show_seconfd_type():
# 获取职位类别分类,并分组统计
secondType_Series = df['secondType'].value_counts()
print(secondType_Series)
# 设置图形大小
plt.figure(figsize=(10, 5))
secondType_Series.plot.bar()
plt.show()
#实习和全职的统计
def show_job_nature():
jobNature_Series = df['jobNature'].value_counts()
print(jobNature_Series)
plt.figure(figsize=(10, 5))
jobNature_Series.plot.pie()
plt.show()
# 获取招聘公司
def show_company():
companyShortName_Series = df['companyShortName'].value_counts()
companyShortName_Series_gt5 = companyShortName_Series[companyShortName_Series > 2]
plt.figure(figsize=(10, 5))
companyShortName_Series_gt5.plot.bar()
plt.show()
if __name__ == '__main__':
show_seconfd_type()
show_job_nature()
show_company()
达到的效果: