如果你不会Python多进程!那你会爬虫?扯淡!抓取拉钩网十万数据

这篇文章我们来抓取 拉钩网 的招聘信息。全部抓取大概十几万条全国招聘信息,并且保存数据库。

准备

安装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')

然后我们打开开发者工具,找到招聘职业的位置。

扫描二维码关注公众号,回复: 1594766 查看本文章

 

 

 

分页

我们首先来分析下网站页数信息。经过我的观察,每个职位的招聘信息最多不超过 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   即可获取源码!

 

猜你喜欢

转载自www.cnblogs.com/PY147/p/9183225.html