欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

最近使用python写了爬虫,感觉体验非常不好,请教各位?

程序员文章站 2022-04-29 10:01:12
...
最近用python写了爬虫,一开始用的3.4,好不容易写完了,但在运行时时常会停止工作,在减少了线程数(16->8)后,稳定性有所提升,但依旧偶尔存在停止工作的问题。因此换了python3.5,发现有些包不支持3.5,于是听从建议换到了最流行的2.7版本,结果sqlite3包无故报错。
DatabaseError: malformed database schema (is_transient) - near "where": syntax error
在sql语句中根本没有where的情况下报这样的错误,而原程序在python3.4下是可以成功运行的,当然3to2的差异我也改了。

最后,在放弃python之前,我想问问各位,python的优势究竟在哪里?我个人感觉语言本身有些不稳定,时常会冒出一些莫名其妙的错误。这究竟是我的问题还是python的问题。

回复内容:

个人觉得在python开发中遇到的问题在其他语言实现时一般也会遇到。解决这些问题的过程就是加深自己某方面理解的过程。

题主没找到问题根本来回换python版本,正好碰到了python的软肋,版本差别大。建议多搜搜错误信息,理解问题所在。

python的优势就如大家所说,简单明了,能很快上手,有大量资源。 我猜你是你爬虫抓的网页里含有where,你一并写到sql里了,导致的你的语句里含有where。
这种问题一般是你自己的问题。 我觉得是编程理念的问题。
编程在大部分情况下都是为了解决问题。为了炫技而做的编程其实是很少的情况。
以爬虫为例。
写爬虫、扒数据,通常都是整个大问题中的很小一部(一般是第一步),扒过来的数据作分析、做筛选、或者说做发帖机器人、哪怕只是只是简单的批量下载妹子图。整个事情的主要精力和主要“产生收益”的环境是后面的。那自然,写爬虫这件事情自然就应该是怎么快怎么来,怎么省精力怎么来。
大部分情况下,Py是做这个事情的最优选择(至少是第一次的最优选择)。所有的编译型语言你就不用想了,准确说,不提供交互式环境的语言都可以不考虑,调试代价太高。那么剩下来的还有什么呢?Python,Nodejs, Ruby。
Nodejs是的设计理念是异步,而对于爬虫这样的程序而言,异步就有点多此一举的感觉。
Ruby其实也是个不错的选择,但是有一些天生的缺陷,它的语法太“精妙”了,你在使用的时候,常常会不由自主的陷入“我可以做的更优雅一些”这样的陷阱之中,而这样优雅给你带来的收益并不啊,你的下一个爬虫的业务逻辑和你的这个爬虫和可能一点相似之处都没有。你很难做到一处优雅、处处优雅。除非你的主业是写Ruby(写ROR的不算哦),不然你会很容易陷入选择困难症之中。
反观Python,简单、粗暴、无脑干。足够简单的语法可以可以让你把主要精力放在:

最近使用python写了爬虫,感觉体验非常不好,请教各位?对面服务器怎么返回来一坨屎


最近使用python写了爬虫,感觉体验非常不好,请教各位?凭什么又屏蔽老子

最近使用python写了爬虫,感觉体验非常不好,请教各位?你就不能一次性把数据加载完

最近使用python写了爬虫,感觉体验非常不好,请教各位?你这个js函数的参数怎么能先传sign2,再传sign1呢!”【真实的故事,某著名网盘签名函数计算时,function(sign2,sign1),为此我卡了两个小时】

最近使用python写了爬虫,感觉体验非常不好,请教各位?小伙你的页面结构写的太渣了

最近使用python写了爬虫,感觉体验非常不好,请教各位?哈哈哈丫502错误了

最近使用python写了爬虫,感觉体验非常不好,请教各位?我果然是个天才”

这些重要的问题上。

当你有了这几次类似体验之后,你发现有些事情是有相似性的。你开始接触一些爬虫的框架,也积累了一些用的顺手的库,提取了一些可以复用的代码,开始有了更开阔的思路。你发现要是能够直接使用目标网站上的JS多好啊,然后开始在Py里面跑js。你发现下载连接似乎是固定的嘛,那我为什么不直接调用wget呢?老板说“你给我个应用程序啊,有界面那种”,你发现用py2exe打包命令行,c#+wpf拖个窗体程序也没那么麻烦。
这个时候你就会有“Python真是好”的感叹,喝着茶就把程序写完了。(什么,你说性能?不然你以为为什么要喝茶呢,等一下嘛。不行加钱升配置啊) 最近使用python写了爬虫,感觉体验非常不好,请教各位?
【完】 我做不出美味的饭,是不是厨具的问题? 「在运行时时常会停止工作,在减少了线程数(16->8)后,稳定性有所提升,但依旧偶尔存在停止工作的问题」

很明显这是因为你不懂多线程编程,没有对相关数据进行加锁保护导致的问题。如果你的逻辑比较复杂的话,后期 debug 这种问题非常困难。

如果你不懂得在多线程程序中时时刻刻考虑另外的线程的存在,对数据进行必要的加锁保护的话,建议你还是不要用多线程了。(如果你一定要用多线程的话,你只能用 Rust 了——在那里,没有对数据进行适当的保护的多线程程序编译通不过的。)

我写过一次多线程的爬虫,然后再也没用过多线程写爬虫了。太费心。

另外就是,请记住 Python 3.x 和 2.x 是相近的两种不同的语言,本来好好的程序换另一个出错很正常。3to2 和 2to3 只是辅助工具,不能完全解决问题的(不然也不用搞得不兼容了)。 咱们一点一点来聊:
好不容易写完了,但在运行时时常会停止工作,在减少了线程数(16->8)后,稳定性有所提升,但依旧偶尔存在停止工作的问题。
首先,爬虫属于IO密集型程序(网络IO和磁盘IO),这类程序的瓶颈大多在网络和磁盘读写的速度上,多线程在一定程度上可以加速爬虫的效率,但是这个“加速”无法超过min(出口带宽,磁盘写的速度),而且,关于Python的多线程,由于GIL的存在,实际上是有一些初学者不容易发现的坑的。

发现有些包不支持3.5
Python2和3的分裂确实比较脑残,但是据我所知,Python爬虫相关的库,大部分已经支持到了Python3.x的,不知道题主用到了什么库。当然,我是倾向于用Python2.7.x的~~~

于是听从建议换到了最流行的2.7版本,结果sqlite3包无故报错。
DatabaseError: malformed database schema (is_transient) - near "where": syntax error
在sql语句中根本没有where的情况下报这样的错误,而原程序在python3.4下是可以成功运行的,当然3to2的差异我也改了。
大大的“syntax error”已经告诉你你的SQL语句出错了~但是,对于爬虫选择数据库,考虑到爬虫数据的多变,建议题主使用NoSQL数据库,如果你暂时没有或者比较迷茫数据库选择,建议从MongoDB开始尝试。

最后,在放弃python之前,我想问问各位,python的优势究竟在哪里?我个人感觉语言本身有些不稳定,时常会冒出一些莫名其妙的错误。这究竟是我的问题还是python的问题。
这里,第一个建议是,将“python”写成“Python”,这是一个软件工程师的严谨态度。其次,Python不敢说是完美的,但是“是我的问题还是python的问题”这句话的答案应该是题主的问题,如果Python可以被一个初学者花三分钟就挑出一个致命的Bug,那么它绝不会有当下的市场。


其实Python本身是非常简单的,虽然有一些“高级”的用法,但是就算不用,一样可以快速写出实用的代码。编程设计到更多的东西是编程语言之外的东西,网络协议、设计模式、数学、算法等等,这些都是跨越编程语言但是编程会使用到的知识,也是高质量代码与低水平代码的差异所在。 很负责任地说是你的问题……因为广大人民群众久经磨练的模块+框架组合下写爬虫都没出啥问题的情况下被你玩出花儿只能说明你对爬虫或者对python中某一项对理解有比较大的问题。

优势其实是简单无脑一把抓,只要懂编码懂http懂html大概懂一点js,如果要写数据库的话稍微懂点儿数据库实在不懂也可以靠orm直接对象化操作数据库,各种*现成的不用重新造,各种框架齐全的细节不用操心……

有没有更方便的选择?有。目前用node写更简单,除此之外……当然,坑也更多就是了。 可以的话就上代码吧! talk is cheap, show me the code 为什么题主不去研究为什么停止工作而是去换版本?python又不是windows→_→