Python网络爬虫3生产者消费者模型
应一位金融圈的朋友所托,帮忙写个爬虫,帮他爬取中国期货行业协议网站中所有金融机构的从业人员信息。网站数据的获取本身比较简单,但是为了学习一些新的爬虫方法和技巧,即本文要讲述的生产者消费者模型,我又学习了一下Python中队列库queue及线程库Thread的使用方法。
生产者消费者模型
生产者消费者模型非常简单,相信大部分程序员都知道,就是一方作为生产者不断提供资源,另一方作为消费者不断消费资源。简单点说,就好比餐馆的厨师和顾客,厨师作为生产者不断制作美味的食物,而顾客作为消费者不断食用厨师提供的食物。此外,生产者与消费者之间可以是一对一、一对多、多对一和多对多的关系。
那么这个模型和爬虫有什么关系呢?其实,爬虫可以认为是一个生产者,它不断从网站爬取数据,爬取到的数据就是食物;而所得数据需要消费者进行数据清洗,把有用的数据吸收掉,把无用的数据丢弃。
在实践过程中,爬虫爬取和数据清洗分别对应一个Thread,两个线程之间通过顺序队列queue传递数据,数据传递过程就好比餐馆服务员从厨房把食物送到顾客餐桌上的过程。爬取线程负责爬取网站数据,并将原始数据存入队列,清洗线程从队列中按入队顺序读取原始数据并提取出有效数据。
以上便是对生产者消费者模型的简单介绍了,下面针对本次爬取任务予以详细说明。
分析站点
我们要爬取的数据是主页显示的表格中所有期货公司的从业人员信息,每个公司对应一个机构编号(G~G)。从上图可以看到有主页有分页,共8页。以G方正中期期货公司为例,点击该公司名称跳转至对应网页如下:
从网址及网页内容可以提取出以下信息:
organid:机构编号,+G++G+currentPage:该机构从业人员信息当前页面编号pageSize:每个页面显示的人员个数,默认20selectType:固定为personinfo
机构名称mechanism_name,在每页表格上方可以看到当前机构名称从业人员信息,即每页的表格内容,也是我们要爬取的对象该机构从业人员信息总页数page_cnt
我们最终爬取的数据可以按机构名称存储到对应的txt文件或excel文件中。
获取机构
获取到某机构的任意从业信息页面后,使用BeautifulSoup可快速提取机构名称
mechanism_name=soup.find(,{class:gst_title}).find_all(a)[2].get_text()
那么有人可能会问,既然主页表格都已经包含了所有机构的编号和名称,为何还要多此一举的再获取一次呢?这是因为,我压根就不想爬主页的那些表格,直接根据机构编号的递增规律生成对应的网址即可,所以获取机构名称的任务就放在了爬取每个机构首个信息页面之后。
获取机构信息对应的网页
每个机构的数据量是不等的,幸好每个页面都包含了当前页面数及总页面数。使用以下代码即可获取页码数。
url_re=re.
- 上一篇文章: 如何爬取知乎所有图片并自动分类下载附源
- 下一篇文章: 没有了