爬虫入门(五)多进程初探+初探数据分析生成简单云图
2017-05-15 23:36
417 查看
爬虫入门(五)多进程初探+初探数据分析生成简单云图
前面呢我们简单介绍了健壮的爬虫,操作数据库等,然而,当数据量大起来的时候,我们的爬虫的效率是很低的,所以我们可以简单的使用多进程,充分利用我们的CPU资源,这里使用的是python自带的进程池来控制进程。
环境:Ubuntu 16.04 python3.6.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 Pool if __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
可以看到java需求的还是最多的,然而我一点都不会,愉快打出GG
相关文章推荐
- 【Python数据分析】简单爬虫,爬取知乎神回复
- Python爬虫爬取京东内存条数据并作简单分析
- 【Python数据分析】简单爬虫 爬取知乎神回复
- python数据分析——安装numpy,生成正态分布并简单分析
- [Mac] R入门 三 基础数据分析的一些简单方法
- Ethereal使用入门(数据流分析工具)
- C#分析数据库结构,使用XSL模板自动生成代码 - 清清月儿 .NET万花筒 Asp.net技术 Asp.net教程 Asp.net源码 Asp.net基础 Asp.net控件 Asp.net入门 - CSDNBlog
- 生成分析报告,移除定时任务,删除历史数据
- JS应用DOM入门:简单文档DOM结构分析
- C#入门(2)简单预定义数据类型
- 正则表达式 特殊字符应用分析[简单详细入门必看]
- Ethereal使用入门(数据流分析工具)
- pl/sql入门第五章--数据库数据对象分析(下)
- windbg入门之旅:(2)一个简单的integer divide-by-zero exception分析案例
- python下如何让web元素的生成更简单的分析
- python下如何让web元素的生成更简单的分析
- 一个生成COBOL测试数据的小程序——分析COBOL中数据声明的语句
- JS应用DOM入门(3):简单文档DOM结构分析
- pl/sql入门第四章--数据库数据对象分析(上)
- [翻译]ADO.NET Entity Framework Beta2(八)/快速入门(实体框架)(3)/生成学校实体数据模型