欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-31 12:45:07
这篇文章我们来抓取 拉钩网 的招聘信息。全部抓取大概十几万条全国招聘信息,并且保存数据库。 准备 安装Mongodb数据库 其实不是一定要使用MongoDB,大家完全可以使用MySQL或者Redis,全看大家喜好。这篇文章我们的例子是Mongodb,所以大家需要 下载 它。 最后我们需要打开管理员权 ......

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

准备

安装Mongodb数据库

其实不是一定要使用MongoDB,大家完全可以使用MySQL或者Redis,全看大家喜好。这篇文章我们的例子是Mongodb,所以大家需要 下载 它。

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

 

最后我们需要打开管理员权限的 CMD 窗口,执行如下命令,安装数据库成服务:

"C:\mongodb\bin\mongod.exe" --config "C:\mongodb\mongod.cfg" --install

设置为服务后,需要在管理员权限打开的windows cmd窗口用服务的方式启动或停止MongoDB。

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

 

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

 

我们先获取首页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')

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

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

 

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

 

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

 

分页

我们首先来分析下网站页数信息。经过我的观察,每个职位的招聘信息最多不超过 30 页。也就是说,我们只要从第 1 页循环到第 30 页,就可以得到所有招聘信息了。但是也可以看到有的职位招聘信息,页数并不到 30 页。以下图为例:

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

 

如果我们访问页面:https://www.lagou.com/zhaopin/Java/31/

也就是第 31 页。我们会得到 404 页面。所以我们需要在访问到404页面时进行过滤。

if resp.status_code == 404:
 pass

这样我们就可以放心的 30 页循环获得每一页招聘信息了。

我们的每一页url使用format拼接出来:

link = '{}{}/'.format(url, str(pages))

获取信息

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

 

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

 

获取到全部信息后,我们同样的把他们组成键值对字典。

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']
如果你不会Python多进程!那你会爬虫?扯淡!抓取拉钩网十万数据

 

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

 

这里是一个pool进程池,我们调用进程池的map方法.

map(func, iterable[,chunksize=None])

多进程Pool类中的map方法,与Python内置的map函数用法行为基本一致。它会使进程阻塞,直到返回结果。需要注意,虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。join()

方法等待子进程结束后再继续往下运行,通常用于进程间的同步.

针对反爬

如果大家就这样整理完代码,直接就开始抓取的话。相信在抓取的不久后就会出现程序中止不走了。我刚刚第一次中止后,我以为是网站限制了我的 ip。于是我做了如下改动。

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

 

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

 

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

 

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

 

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

 

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

 

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

 

如果博主后面把全部数据抓下来后,可以和大家一起进行数据分析,分析Python招聘的一些信息啊什么的。大家加油。

进群:125240963   即可获取源码!