爬虫入门(五)多进程初探+初探数据分析生成简单云图
前面呢我们简单介绍了健壮的爬虫,操作数据库等,然而,当数据量大起来的时候,我们的爬虫的效率是很低的,所以我们可以简单的使用多进程,充分利用我们的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()