啊哈,自己太懒了,招聘信息什么的懒的看了,索性抓取下来慢慢看。
1. 我为什么要爬取招聘信息
其实我就是太懒了,虽然我是个做Android的,但是挡不住我使用Python的热情。
2. 如何实现
懒得说了,你自己看代码吧。
2.0 一些说明
1. 为什么需要Cookie
按照现在网站的尿性,没有Cookie,你什么信息也拿不到。
所以老实的登录吧,然后使用自己的Cookie,反正我的Cookie是不会给你用的。
2. 如何获取网页URL
我觉得这个问题太简单了,我拒绝回答!
哈哈,Chrome啊等浏览器自带的开发工具,足够分析使用了。
3. 严重警告
代码写的一般,大家随便看看就好,想用的自己去改造。
2.1 LagouSpider
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Date: 2018-12-04 09:56:28
from bs4 import BeautifulSoup
from urllib import request, parse
import os
import json
from Utils import CsvWriter
class LagouSpider:
'''
抓取拉勾上的招聘信息。
因为限制的原因,必须要求你登录自己的账号后,截取所需的Cookie。
'''
def __init__(self, url):
self.page_header = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Host': 'www.lagou.com',
'Origin': 'https://www.lagou.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
'Connection': 'keep-alive',
'Referer': 'https://www.lagou.com/jobs/list_Android?labelWords=&fromSearch=true&suginput=',
'X-Anit-Forge-Token': 'None',
'X-Requested-With': 'XMLHttpRequest',
'Cookie': '填写你登录拉勾网后的Cookie信息'
}
self.url = url
self.tags = [('positionId', '职位ID'), ('positionName', '职位名称'), ('salary', '薪资'), ('createTime', '发布时间'), ('workYear', '工作经验'), ('education', '学历'), ('positionLables', '职位标签'), ('jobNature', '职位类型'), ('firstType', '职位大类'), ('secondType', '职位细类'), ('positionAdvantage', '职位优势'), ('city', '城市'),
('district', '行政区'), ('businessZones', '商圈'), ('publisherId', '发布人ID'), ('companyId', '公司ID'), ('companyFullName', '公司名'), ('companyShortName', '公司简称'), ('companyLabelList', '公司标签'), ('companySize', '公司规模'), ('financeStage', '融资阶段'), ('industryField', '企业领域'), ('industryLables', '企业标签')]
def fetch_page_info(self, page_num, keyword, file_path):
'''
根据url来获取网页内容。
page_num:页数。
keyword:关键字
file_path:写入文件的路径,要求必须为csv文件。
'''
if self.url is None:
print('Url为空,无法获取信息。')
return
file_name = os.path.basename(file_path)
if not file_name.endswith('csv'):
print("请使用csv文件来记录信息。")
return
if not keyword.strip():
print("关键字不能为空。")
return
page_data = parse.urlencode(
[('pn', page_num), ('kd', keyword)])
req = request.Request(self.url, headers=self.page_header)
page = request.urlopen(req, data=page_data.encode('utf-8')).read()
page = page.decode('utf-8')
print('Get content is:{}'.format(page))
if page is None:
print('Text is Null.')
return
data = json.loads(page)
postionResult = data.get('content').get('positionResult').get('result')
# 将数据记录至CSV中
# 首先写入头
headers = []
for tag in self.tags:
headers.append(tag[1])
rows = []
rows.append(headers)
for position in postionResult:
row = []
for tag in self.tags:
row.append(position.get(tag[0]))
rows.append(row)
CsvWriter.writeRows(filePath=file_path, rows=rows)
# # 将数据写入文件中
# with open('Position.txt', 'w+') as f:
# for position in postionResult:
# f.write("---------------------------\n")
# for tag in tags:
# f.write(str(tag[1])+":"+str(position.get(tag[0]))+"\n")
# print("解析完毕。")
if __name__ == '__main__':
url = r'https://www.lagou.com/jobs/positionAjax.json?city=%E4%B8%8A%E6%B5%B7'
spider = LagouSpider(url)
filePath = os.path.dirname(__file__)+os.sep+'Position_Patch.csv'
for index in range(1,9):
spider.fetch_page_info(
page_num=index, keyword='Android', file_path=filePath)
print("解析完成,请查看文件。")
2.2 Utils
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Date: 2018-12-04 14:21:39
import csv
class CsvWriter:
@staticmethod
def writeRow(filePath, row):
with open(filePath, newline='', mode='a') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(row)
@staticmethod
def writeRows(filePath, rows):
print(len(rows))
with open(filePath, newline='', mode='a') as f:
csv_writer = csv.writer(f)
csv_writer.writerows(rows)
class CsvReader:
@staticmethod
def printRows(filePath):
with open(filePath, 'r+') as f:
reader = csv.reader(f)
for row in reader:
print(row)
3. 总结
我注释写的那么详细,如果存在疑问,欢迎留言。
网友评论