说一说,这段事件做一个爬虫外包项目的糟心事儿。

2016-01-10 08:23:15 +08:00
 besttime
事情是这样的。
上个月在 csto 上接了一个爬虫的外包项目。发包方要求爬取 58 和赶集的,所有城市的所有分类数据。
2016 年 1 月 3 日,首次完成计划时,我便向发包方提交了源代码以及开发文档。
发包方经测试后程序的几项功能实现的方式与他的需求不符。(主要在于对抓取数据的选择,以及监控这两个功能上。我的想法是在数据库提取数据这个层面上进行实现,主程序只管抓取,以保证数据的完整性。发包方希望在程序内部进行实现。)我接受发包方的修改意见,并熬夜进行源代码的修改。加入了数据选择的功能。
第二天,发包方又以需要选择多线程的线程数量为由,需要修改代码。(原始项目需求并没有多线程这一项,是我作为开发者的良知,希望程序运行效率高才加入的。)我也尽力的满足发包方的需求连夜进行了修改。
后来,发包方又以监控模块不能很好的满足他的需求要求重构监控模块。而后,我又秉承满足发包方的任何需要,连着熬了几晚,进行了监控模块的重构。(这个功能本来有一定的不稳定性,发包方希望抓取数据与数据库的数据进行对比,并识别是否有新的数据。但是,抓取对象给的数据是不稳定的,这造成了此功能的不稳定性,发包方一直不满意。)
因为,后续修改的代码,发包方经常催促。程序的测试不够充分,运行时会有报错。一旦发现报错,我也马上找出原因,并修改错误。但,发包方经常以此为由,对我进行开发实力上的否定。
现在项目支付期限到期前一天,发包方提出了修改成果的申请。我积极的在 qq 上询问发包方程序哪里还有不满意之处。并承诺,在可行的范围内,一定配合他的想法对程序进行修改,但一直得不到发包方的回复。
请大家帮忙分析下,我接下来该怎么办?


这里补上一封我给发包方发的 emial ,算是我对事件详细过程的描述以及吐槽。


既然项目的进程已经发展到了这个地步,很多事儿我也就不在忍着去做了,有些话还是跟你敞开了说了的好。可能有些地方言语有些激烈,但是我实在是忍了很久了。很多东西,对你有益,听得进去就听。听不进去就算了。
首先来说一下,这几天你一直纠结的监控模块。不得不说这其实是极为愚蠢的做法。监控新数据无论怎么去实现,都要重新的爬一次目标网站的。主程序爬取一次数据,还要监控程序再爬取一次?呵呵,在我看来爬一次都是风险非常大的事情,毕竟你是整站爬取啊。一次的爬取请求量都是极为大了的。你真的以为目标网站的运维都是吃干饭的?我来告诉你对于这种异常的大流量请求连接对方会怎么做。首先判断你的意图(一般都是爬取数据嘛,别人心里也是有数的。),然后非但不限制你的流量,反而会让你爬取数据畅通无阻,然后在给你的数据里掺杂一些特定的字符,然后通过这些特定字符找到你的网站,通过你的网站查询你的服务器所在地,域名备案信息。然后收集你的爬取服务器数据。最后就直接提交目标网站的司法部门,走司法程序了。到时候我相信你哭都哭不出来(毕竟爬这种大范围的爬取说穿了就是偷别人的数据呗。)。
其次,我来说一下从首次提交源代码你所要求的更改。
第一次,你说要要有抓取数据选择的功能,恩,说实话这个我觉得还有一点用处,毕竟重点的城市,自定义的多抓取几次,多获取一些定点的数据也是能够理解,之前我想的是先抓取全部的数据,以保证数据的完整性,然后这个功能由数据库提取数据层面上进行解决。但是,你有没有考虑自动化的问题?你是打算每天自己控制爬取一遍数据再提交到服务器给你的用户展示?你要是这么想的我只能给你点个赞了。恩,既然你有需要,我也只能尽力去实现,二话不说,熬个通宵把你的抓取数据选择给做出来了。
第二次,你说要能够选择多线程的抓取数量,我也就呵呵了,我还就先不说你一开始都没说过要多线程,还是我想程序有好的效率给你加上去了。你就不能上次一块儿说了?非得我把一个地方弄好了,然后提出一个新的需要?也行吧,毕竟你是甲方嘛,有需求我是应该尽力的完成,然后我就熬夜重构了多线程的模块。重构你懂吗?所有的东西都删掉重新写。又是一夜熬到第二天早上十点你懂吗?
第三次,恩,多线程弄好了,然后你又说这个监测模块没有啊。我之前说,数据库是去重的,能够写入数据库的就是新的数据,这样也可以当做监测新数据的方式,你也不置可否,现在又来说这个。我也就呵呵呵了,您就不能一次性把这些一起说完啊?你一说就是有十年的 c++编程经验。你不知道一个模块的增加删改程序的其他地方都是要跟着改的嘛?你不一次性说完,每次新的问题我都要改很多地方的好嘛?这也就不说了,甲方有需要嘛,烟茶备好,又是一个通宵。
第四次,恩,监控模块整出来了,但是你那边一运行就报错,然后就是我编程实力有问题,我菜。是啊,我怎么这么菜呢?一晚上把构建,编码,调试,测试都做了,竟然还会有报错,我怎么这么菜呢?后来边调边测,代码运行没问题了,你又说,小伙子啊,你这个实现的不怎么好啊,没有达到我的预计目标啊。我说要根据日期监测,你怎么弄个根据页面位置的 url 监测啊。我也是呵呵哒了,网站同一天的日期都是 2016-01-08 ,这样监测的还有什么意义?你今天爬取了,数据库里有今天的数据肯定就不能识别啊,那你爬取之后的的同一天发布的数据就不是新数据咯?算了,你这甲方嘛,你既然都这么要求了。我就按你的要求来吧。
第五次,那天是凌晨 4 点跟你沟通晚,然后当晚没睡,重构监测模块到第二天下午 6 点。因为目标网站时间格式极为混乱,什么 xxxx-xx-xx 啊,什么 xx-xx 啊,什么 x 天前啊,什么 xxxx.xx.xx 啊都有,我需要足够多的尝试给这些混乱的时间格式编码,让其能准确无误的转换为时间戳,然后进行比较,取最大输出。期间你一直在催,这么还没有搞好,是不是做不出来啊?呵呵。午 5 点多,提交代码。在你那边运行有报错,你就说我这人是怎么,把你当成测试了嘛?为什么不测试好再发给你。是啊,我这么不测试好呢?我连熬二十多个小时的时间都是喂狗了?呵呵达,检查发现报错原因原来是读取数据库的时间参数后,因为数据库的时间参数是带中括号的,然后 time 库并不能把带中括号的参数转换成时间戳。之前是你说要把写入数据库的数据的括号给去了的。现在因为这个报错就是我的程序设计不稳健,实现没有判断是否有中括号咯?
恩,代码改了 5 次,最后终于看起来没什么问题了,在没有跟我说哪里有问题的情况下,直接再 csto 平台申请项目成果修改,理由是项目成果存在重要的问题,需要给时间我去解决,呵呵呵呵哒。
然后,我想着毕竟你是甲方嘛,尽量多去沟通,再 qq 上捏着鼻子问你,是不是还有什么其他问题。要是有的话,我尽力再可行性的范围内配合你进行解决。你倒好,一个字不回了。我也就没办法了,申请项目到争议期咯。
我先不说你说你有着十年的 c++开发经验。但是,任何的 it 常识都没有,分布式不知道, vps 不知道,任何报错都要问我来解决问题,连终端提示 sql 语句不存在都看不出来。你说我菜,你知不知道你打算要用的网站有多菜?一个 php 的简单框架,看代码还是 github 上面的开源框架稍微修改一下给你做出来的。我就呵呵达了,我想着你这个项目还是有一定的特性的,都没用 scrapy 。都是我一点一点的分析目标网站,一点一点的做架构。套个框架就不菜了?早知道我也拿个框架一套,多简单,一两个星期可以搞定的事情,你还高兴。还有,你有没有看到你那网站上面的分类像什么一样堆在那里,你都不知道进行多级分类的嘛?我都给你爬取数据做了一到三级的分类,你自己的网站确是这样,怪不得你之前还说,每个分类应该是独立的,为什么数据库就只有那么七八张表。说到这里我就想起来了。光数据库我就给你解释了差不多三个小时吧。为什么要这样设计,为什么要这样分类?这些分类的数据有怎样共同的数据结构?呵呵达,这个都要问我?自己打开表看一下字段不就可以了?我还特地把表的字段大多数用拼音来表示,就是怕你看不懂。从一开始,发现你连分布式和 vps 是什么都不知道的时候我就知道你的计算机基础也就这样了。
你的项目我做了这么久,两个目标网站的代码我基本上看了个遍。我就问你一句。目标网站的代码你看过没有?我估计你是一下都没看的,你连目标网站的代码是什么样的,完全不知道各种数据是以什么样的方式存在在 HTML 里,完全不知道,各种功能的实现需要依赖目标网站的哪些特性。然后就按你想的来咯?没实现就是我菜咯?实现了不怎么稳定就是我菜到离谱咯?我说我有我的实现方式,很大的一部分原因是因为这是一个爬虫啊,朋友,爬虫不是只单单在自己机器上跑的。爬虫是需要从别人的服务器拿数据的,拿到怎么样的数据不是我能说了算的。真的不是我没测试啊,是别人给的各种数据的不稳定性太大了。毕竟我们是要依赖于别人拿数据的,过段时间网站迭代了,数据改了,我们也要接着改的。爬虫说穿了是一个数据导向性的程序,为了拿到更多跟准确的数据,其他的任何都可以为其让道的。拿到数据才是真的。
说了这么多,其中有一些是对你有益的,有一些是对开发过程的吐槽。吐槽的,你可以忽略,听的进去的就听。你也可以把这封邮件发给 csto 的协调人员。我也会把这封邮件发到我们程序员的圈子里,让广大的程序员评评理。(以上只是就事论事,没有任何隐私信息。)
最后,我还是想这个项目有一个好的结果,请放下你的偏见,放下你那 10 年 c++的经验,想一想这个项目,想通了,我们再来沟通如何解决现在的局面(当然,这个前提是你不是一开始存心就打算骗程序的。)这段时间因为你这个项目,已经严重的影响到了我的生活。所以,请自重。我程序已然基本开发完毕,若你拒不支付报酬,我会以任何合法的途径解决问题,谢谢。
14852 次点击
所在节点    程序员
58 条回复
woai110120130
2016-01-10 08:43:25 +08:00
这个你首先要确定他是不是骗程序,其次一开始的需文档应该写的清楚 加新的功能需要加钱实现
wxg4net
2016-01-10 08:56:50 +08:00
一定要以合同约束为原则,任何需求之外有费用的更改必须直接付费,让对方知难而退。
前段时间我也有个类似客户,投诉我的程序( web )质量。在他投诉之后,我强行在对方服务器清掉了程序源码和数据库。惹技术服务商不是找死么... 千万不能让客户带着走(因为变更会导致风险增高)...
fakir
2016-01-10 09:04:52 +08:00
信任是多麼重要呀
creatorYC
2016-01-10 09:14:39 +08:00
那个所谓程序猿的甲方是不是该这样:哎呀,你这么菜,我可是有 10 年开发经验的,让你这样浪费时间不如我自己来,于是撸起袖子就去噼里啪啦了.....真反感不守信用还一副高高在上样子的人,顶楼主
ericls
2016-01-10 09:22:09 +08:00
楼主这一帖子替好多人出了一口恶气啊
laoyuan
2016-01-10 09:42:50 +08:00
@ericls 然并卵
ljcarsenal
2016-01-10 09:43:47 +08:00
@wxg4net 最后怎么解决的 哈哈
madshaw
2016-01-10 09:53:56 +08:00
@ljcarsenal 估计客户服软了
kslr
2016-01-10 09:55:16 +08:00
你别这么好,按合同来
twor2
2016-01-10 09:58:16 +08:00
我下定决心不做外包啦 2016 年开始
fire5
2016-01-10 10:15:35 +08:00
外包伤身
Ellison
2016-01-10 10:23:48 +08:00
所以有后续结果了没...
dai269619118
2016-01-10 10:41:38 +08:00
最近我也在做外包 整个人就想机器一样的写代码 和 流水线上的工人一样
不过念在钱多的份上 忍过去了
leekelby
2016-01-10 10:49:41 +08:00
需要有一个“按时间计费,预先付款”,并且需求明确的平台...
boyhailong
2016-01-10 11:00:13 +08:00
所谓动不动把自己有多少年开发经验的人 到底是什么心态?很有经验 倒是觉得有点倚老卖老的味道
gdtv
2016-01-10 11:12:52 +08:00
请教楼主一个问题,怎么判断 58 同城上的信息是新信息?怎么只抓取未入库的新数据? 58 同城有个“刷新”信息的功能,发布者在后台执行刷新操作,原先发布的信息的日期就变成今天了,但信息的 ID 不变,所以根据发布日期无法判断是否新数据,在 58 同城上按发布日期排序,排前面的也不一定是新数据。所以好像只能按照你的方法“先全部入库再在数据库查询层面解决”?
sjtlqy
2016-01-10 11:19:27 +08:00
大家还是到正规的公司里面去做点正规的事情吧,至少不会有人欺骗你.
你大爷我最受不了出尔反尔的人,留点骨气.
pc10201
2016-01-10 12:04:27 +08:00
作为一个 python 程序员,我觉得做 web 比做爬虫简单
ChiChou
2016-01-10 12:09:34 +08:00
10 年的 C++ 经验能智力低下成这样,这 10 年都去写的什么玩意儿
iamaprin
2016-01-10 12:14:39 +08:00
@ChiChou V2EX 怎么举报无帮助还有人身攻击回复?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/249623

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX