您现在所在的位置:首页 >学员就业 > 学生感言 > Python1707A学员感言:写爬虫很简单又很难

Python1707A学员感言:写爬虫很简单又很难

来源:奇酷教育 发表于:

 通过这次做项目,使我对项目开发有了进一步的认识。做项目的时候,最重要的不是自己如何快速地将自己分配的任务做完,而是要注重团队合作

 通过这次做项目,使我对项目开发有了进一步的认识。做项目的时候,最重要的不是自己如何快速地将自己分配的任务做完,而是要注重团队合作。一开始组内必须对这个项目的数据库的命名进行讨论,定义表的属性的数据类型,表与表之间会有关联,所以有的属性的类型与长度必须定义一致,这样访问数据库时才不会出错。如果一开始不将这些步骤统一下来的话,就会给后面的编程带来一系列的问题。
 
    整个一周的项目,第一天我们就对项目的数据库以及数据表有了初步的建立,然后后面还有许多模块需要分工,当然,有些具体的模块需要完成的功能,都还不甚清楚,因此我们第一天就针对这个web项目做了一个简单的Django框架的搭建,以及前期项目比较依赖的登录注册部分给完善了出来。
    整个项目包含了有:购物车,商品列表页,商品详情页,订单页面,支付页面,个人用户信息完善页面,首页的完善展示和一些小功能,然而我们组有5个人呢,我有身为组长,其中最重要的一部分,商品数据的获取部分就是由我来做的。
    从第二天开始,我们就开始按照各自的分工开始写自己的项目了,但是,一旦开始些项目之后,随之而来的各种问题就出现了,例如商品列表页面需要一些基础的数据部分,这些数据是需要我来爬取,具体的商品需要分类,这些商品类型也是需要我首先爬取一部分基础的测试数据的,还有一部分商品详情页的内容也是需要我先爬取一部分基础测试数据的,因此,我就开始了我的基础测试数据的爬取。
    我选择的是爬虫,因此为了起初为了效率,我是选择的比较高效率的scrapy框架来爬取数据的,但是,当写了一段时间代码之后,发现自己对着一套框架并不熟悉,底层封装的各种代码,的用途都不是很熟悉,感觉就是写代码根本就是不可控制的,这就很难受,几经犹豫,最终我转回了基本的requests模块,虽说比较基础,但也还没到了urllib2的那种程度,因此写起来也就比较得心应手了,同时感觉可控制性也比较强,一天下来,商品列表的爬取代码也写的差不多了,到了爬取数据的时候终于还是出了不少问题。
    比如,再匹配页面数据的时候,我选择的是使用Xpath来匹配页面数据,明明在网页上使用的xpath查询工具能够匹配到数据,可是写在代码里面就是匹配不到数据,这个问题一直困扰了,我很长时间,直到我上网百度之后,才发现,有些问题还是自己的问题,当顺利解决之后,最终还是选择了使用正则与Xpath的混合使用完成了商品类型列表的爬取部分。当然,这也是我第二天完成了自己爬取组内基础测试数据部分的爬取。
    由于我写的是爬虫,当项目的数据模型类基本定下来之后,就只需要关心自己的数据问题与数据库的数据的对应问题就可以了,可是,身为项目小组中的组长,我还是要肩负一部分的责任的,一天下来,组内成员也积累了不少问题,比如,白天在代码同步的时候,总会有些人因为在提交之前没有更新,其他人再更新的时候,就会莫名的有一部分代码被删掉,这些都是更行代码不同步的问题,当然,其他问题也在讨论的时候得到了一一的解决。
    到了第三天,真正需要完整的爬取整站的数据的时候,终于还是出了不少问题,例如:这次我们的模板是个全英文的电商网站模板,因此,我在爬取国内网站的中文数据,放在一块就会显得非常的不伦不类的感觉,在几经权衡之下,我选择了爬取国外同样的一个大型电商网站。
    又经过了一天的奋斗之后,写完了一套代码,问题总是在不经意间到来,由于爬的是国外网站的数据,因此爬取数据的时候,效率就异常的低,几乎是两三秒爬取一条的商品数据,然而整站的数据算下来几乎能达到40000条数据,这样肯定是不行的,何况还要保存,入库,如果整个爬下来之后再入库肯定是不行的,首先内存就会不支持,因此,不得已我就考虑会不会是我的代码的性能问题。
    于是乎,又接下来的一天我就对代码做了大量的修改,完全改成了多进程多线程式的操作,可是结果仍不尽如人意,效率不见提升,反而又降低了不少,经过跟组员门的讨论之后,考虑应该是数据量是固定的,多线程爬取的话,就会造成并发量过大,同时发送的请求量占用了大量的带宽,导致了下行数据的速度非常缓慢。
    不得已,我又对代码做了大量的修改,于是乎,第三个版本就是,单纯的双进程,一个写入数据,一个爬取数据,这样下来,效率倒也还好,但是也就跟刚开始差不多,就这样爬取了一整天,期间跟其他组员共同完成了许多其他难以解决的问题。
    问题的出现总是不可避免的,出现了就要解决,这次的问题就是,爬了整天的数据,到最后,一直只是写入,却并没有保存,因此到了最后需要加快进度,于是就又一次修改代码,在爬取数据 的时候,没爬取一类自动保存一次,当然,为了不重复爬取,同时增加了指纹集合的功能,这次总算能有一部分数据了。
    当然,最后肯定不能就这样草草结束,项目还并不完整,结束以后,一些细节以及数据,仍然需要完成。总体来说,在此次项目中,我们小组虽说经历了各种困难,但我们都凭借各种途径解决掉了,增加了项目协同开发的经验的同时,我也觉得这就是一种自我提升的手段,相信对以后自己的工作中会有很大的用处的。