爬虫入门(五)多进程初探+初探数据分析生成简单云图

来源:互联网 发布:pdf转换成word 知乎 编辑:程序博客网 时间:2024/05/21 01:52

爬虫入门(五)多进程初探+初探数据分析生成简单云图

前面呢我们简单介绍了健壮的爬虫,操作数据库等,然而,当数据量大起来的时候,我们的爬虫的效率是很低的,所以我们可以简单的使用多进程,充分利用我们的CPU资源,这里使用的是python自带的进程池来控制进程。

环境:Ubuntu 16.04 python3.6.1

因为妹子图最近不太稳定(你们懂的),再加上最近在找实习,那么今天我们就选择智联招聘,来做简单的介绍吧

我们首先登录一下智联,然后选择一下自己的地区和岗位

1

然后简单的用chrome抓下包,并没有发现异步的气息,而且没有cookies的信息,而且我们神奇的发现,网页的信息都在它的html里面了,无疑给我们带来了很大的方便嘛(2333)

然后看一下翻页的URL,再次惊奇的发现URL只有最后一个数字有变化(2333)

这里就懒得截图了,比较简单的分析

直接requests请求,然后xpath抓取就可以了,这里要注意的是网站有一些紧急招聘,会有多余的没用信息在里面,我们直接过滤掉就好了

我们直接给出代码

base_url = "http://sou.zhaopin.com/jobs/searchresult.ashx?bj=160000&in=210500%3b160400%3b160000%3b160600&jl=763&sm=0&sg=b91979185b5743f4889233ef9d378d4a&p="headers = {    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}client = MongoClient(connect=False)db = client['zhilian']collection = db['zhilian']def get_page(page=1):    now_url = '{}{}'.format(base_url,str(page))    selector = html.fromstring(requests.get(now_url,headers=headers).text)    #获取工作名称    jobname = selector.xpath('//table[@class="newlist"]/tr/td/div/a/text()')    #过滤掉网站上的紧急招聘的多余内容    jobname = filter(lambda x:x!='\xa0',jobname)    #获取公司名称    gsmc = selector.xpath('//table[@class="newlist"]/tr/td[@class="gsmc"]/a/text()')    #获取职位月薪    zwyx = selector.xpath('//table[@class="newlist"]/tr/td[@class="zwyx"]/text()')    #获取工作地点    gzdd = selector.xpath('//table[@class="newlist"]/tr/td[@class="gzdd"]/text()')    for job,gs,yx,dd in zip(jobname,gsmc,zwyx,gzdd):        dict = {            "职位名称":job,            "公司名称":gs,            "月薪":yx,            "工作地点":dd        }        collection.insert(dict)        print(dict)        print(u'插入数据库成功')def run(i):        get_page(i)

然后呢我们开启进程池,导入进程池模块

from multiprocessing import Poolif __name__ == '__main__':    p = Pool(2)    for i in range(1,90+1):        p.apply_async(run,(i,))    p.close()    p.join()

这里呢Pool()函数传入开启的核心数,默认是你电脑的CPU核心数

p.apply_async()方法是非阻塞方法,第一个参数为启动工作的函数,第二个参数为前面函数需要的参数的元组

然后p.close() 关闭进程池,就是不再接受新任务啦

p.join() 等待所有子线程完成工作返回

这是最简单的用法,当然更多的可以参考官方文档,接下来几天(不知道什么时候)我会更新进程池代码的解析(因为被某些神秘力量控制,我被一个神奇的地方坑了好久,怒看了一遍源码)

这样呢我们就开了两个进程来爬取智联上的所有符合我选择的工作的信息了,并且存在了mongodb上

那么我们爬取了这么多数据,来干嘛呢?显然获取数据只是第一步,对数据的分析结果其实才是我们想要的

我们就用云图来做一个最简单的分析,首先确保自己安装好wordcloud库

pip install wordcloud 安装导入模块from wordcloud import WordCloud显示图片的模块import matplotlib.pyplot as plt

代码很简单

jobname = []for job in collection.find():    jobname.append(job['职位名称'])    print(job['职位名称'])job_name = ' '.join(jobname)my_wordcloud = WordCloud(max_words=100,width=1600,height=800,font_path='ukai.ttc',random_state=30).generate(job_name)plt.imshow(my_wordcloud)plt.axis('off')plt.show()

我们之前已经爬取了信息存在了Mongodb,那么就没必要再去爬了,以免增加网站的负担

下面呢就是生成一个云图,并且显示出来

比较多人遇到的问题是生成出来的云图是显示不了中文的,原因是因为源代码里面默认的文字格式是不支持中文的,你可以通过修改源代码或者直接在构造函数里声明字体,ubuntu有楷体的字体,我就直接用这个了

可以参考我以前写的一篇简单介绍http://blog.csdn.net/qq_21057881/article/details/69562028

2

可以看到java需求的还是最多的,然而我一点都不会,愉快打出GG

原创粉丝点击