python多进程爬虫写入mysql_Python多进程抓取拉钩网十万数据

准备

安装Mongodb数据库

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

在Windows中。由于MongoDB默认的数据目录为C:\data\db,建议大家直接在安装的时候更改默认路径为C:\MongoDB.

然后创建如下目录文件:

C:\data\log\mongod.log  //用于存储数据库的日志

C:\data\db    //用于存储数据库数据

然后在C:\MongoDB文件夹下(安装 Mongodb 路径)创建配置文件mongod.cfg。并且在配置文件里写入以下配置:

大家记住要打开文件后缀名,不然我们可能创建了一个mongod.cfg.txt文件。

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

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

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

net start mongodb    //启动mongodb服务

net stop mongodb     //关闭mongodb服务

好了,安装好Mongodb数据库后,我们需要安装PyMongo,它是MongoDB的Python接口开发包。

pip install pymongo推荐下我自己创建的Python学习交流群960410445,这是Python学习交流的地方,不管你是小白还是大牛,小编都欢迎,不定期分享干货,包括我整理的一份适合零基础学习Python的资料和入门教程。

开始

准备完成后,我们就开始浏览拉勾网。我们可以发现拉勾网所有的招聘职位都在左侧分类里。如图:

我们先获取首页HTML文件:

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

大家还记得BeautifulSoup的CSS选择器吧,我们直接使用.select()方法获取标签信息。

输出结果:[Java, C++, # ... 省略部分 https://www.lagou.com/zhaopin/fengxiankongzhizongjian/" data-lg-tj-cid="idnull" data-lg-tj-id="4U00" data-lg-tj-no="0404">风控总监, https://www.lagou.com/zhaopin/zongcaifuzongcai/" data-lg-tj-cid="idnull" data-lg-tj-id="4U00" data-lg-tj-no="0405">副总裁]

260

获取到所有职位标签的a标签后,我们只需要提取标签的href属性和标签内内容,就可以获得到职位的招聘链接和招聘职位的名称了。我们准备信息生成一个字典。方便我们后续程序的调用。

这里我们用zip函数,同时迭代两个list。生成一个键值对。

接下来我们可以随意点击一个职位分类,分析招聘页面的信息。

分页

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

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

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

ifresp.status_code ==404:

pass

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

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

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

获取信息

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

组成字典的目的是方便我们将全部信息保存到数据库。

保存数据

保存数据库前我们需要配置数据库信息:

这里我们导入了pymongo库,并且与MongoDB建立连接,这里是默认连接本地的MongoDB数据。创建并选择一个数据库lagou,并在这个数据库中,创建一个table,即url_list。然后,我们进行数据的保存:

ifurl_list.insert_one(data):

print('保存数据库成功', data)

如果保存成功,打印出成功信息。

多线程爬取

十万多条数据是不是抓取的有点慢,有办法,我们使用多进程同时抓取。由于Python的历史遗留问题,多线程在Python中始终是个美丽的梦。

我们把之前提取职位招聘信息的代码,写成一个函数,方便我们调用。这里的parse_link()就是这个函数,他就收职位的 url 和所有页数为参数。我们get_alllink_data()函数里面使用for循环 30 页的数据。然后这个作为主函数传给多进程内部调用。

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

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

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

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

反爬虫处理

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值