这篇文章我们来抓取 拉钩网 的招聘信息。全部抓取大概十几万条全国招聘信息,并且保存数据库。
准备
安装Mongodb数据库
其实不是一定要使用MongoDB,大家完全可以使用MySQL或者Redis,全看大家喜好。这篇文章我们的例子是Mongodb,所以大家需要 下载 它。
最后我们需要打开管理员权限的 CMD 窗口,执行如下命令,安装数据库成服务:
"C:\mongodb\bin\mongod.exe" --config "C:\mongodb\mongod.cfg" --install
设置为服务后,需要在管理员权限打开的windows cmd窗口用服务的方式启动或停止MongoDB。
我们先获取首页HTML文件:
import requests from bs4 import BeautifulSoup from requests.exceptions import RequestException url = 'https://www.lagou.com/' # 获取页面源码函数 def get_page_resp(url): headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'} try: resp = requests.get(url, headers=headers) if resp.status_code == 200: return resp.text return None except RequestException: return None soup = BeautifulSoup(get_page_resp(url), 'lxml')
然后我们打开开发者工具,找到招聘职业的位置。
分页
我们首先来分析下网站页数信息。经过我的观察,每个职位的招聘信息最多不超过 30 页。也就是说,我们只要从第 1 页循环到第 30 页,就可以得到所有招聘信息了。但是也可以看到有的职位招聘信息,页数并不到 30 页。以下图为例:
如果我们访问页面:https://www.lagou.com/zhaopin/Java/31/
也就是第 31 页。我们会得到 404 页面。所以我们需要在访问到404页面时进行过滤。
if resp.status_code == 404: pass
这样我们就可以放心的 30 页循环获得每一页招聘信息了。
我们的每一页url使用format拼接出来:
link = '{}{}/'.format(url, str(pages))
获取信息
获取到全部信息后,我们同样的把他们组成键值对字典。
for position,add,publish,money,need,company,tag,fuli in \ zip(positions,adds,publishs,moneys,needs,companys,tags,fulis): data = { 'position' : position.get_text(), 'add' : add.get_text(), 'publish' : publish.get_text(), 'money' : money.get_text(), 'need' : need.get_text().split('\n')[2], 'company' : company.get_text(), 'tag' : tag.get_text().replace('\n','-'), 'fuli' : fuli.get_text() }
组成字典的目的是方便我们将全部信息保存到数据库。
保存数据库
保存数据库前我们需要配置数据库信息:
import pymongo client = pymongo.MongoClient('localhost', 27017) lagou = client['lagou'] url_list = lagou['url_list']
这里是一个pool进程池,我们调用进程池的map方法.
map(func, iterable[,chunksize=None])
多进程Pool类中的map方法,与Python内置的map函数用法行为基本一致。它会使进程阻塞,直到返回结果。需要注意,虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。join()
方法等待子进程结束后再继续往下运行,通常用于进程间的同步.
针对反爬
如果大家就这样整理完代码,直接就开始抓取的话。相信在抓取的不久后就会出现程序中止不走了。我刚刚第一次中止后,我以为是网站限制了我的 ip。于是我做了如下改动。
如果博主后面把全部数据抓下来后,可以和大家一起进行数据分析,分析Python招聘的一些信息啊什么的。大家加油。
进群:125240963 即可获取源码!