怎么用php写爬虫,为什么php不适合做计算密集型业务?
PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。
1.优点:开源 免费性 快捷性 [程序开发快,运行快,技术本身学习快]
1)跨平台,性能优越,跟Linux/Unix结合别跟Windows结合性能强45%,并且和很多免费的平台结合非常省钱,比如LAMP(Linux /Apache/Mysql/PHP)或者FAMP(FreeBSD/Apache/Mysql/PHP)结合,或者数据应用够大可以考虑换 PostgreSQL或者Oracle,支持N种数据库。(N >= 10)
2)语法简单,如果有学习C和Perl的很容易上手,并且跟ASP有部分类似。有成熟的开发工具,比如NuPHPed,或者Zend Studio等等,再Linux平台下可以使用Eclipse等等。
3)目前主流技术都支持,比如WebService、Ajax、XML等等,足够应用。
4)有比较完整的支持,比如使用ADODB或者PEAR::DB做数据库抽象层,用Smarty或者smart template做模板层,如果是PHP 5.1的话,还能够使用PDO(PHP Data Object)来访问数据库。
5)有很多成熟的框架,比如支持MVC的框架:phpMVC,支持类似ASP.net的事件驱动的框架:Prado,支持类似Ruby On Rails的快速开发的框架:Cake等等,足够满足你的应用需求。
6)PHP 5已经有成熟的面向对象体系,能够适应基本的面向对象要求。适合开发大型项目。
7)有成熟的社区来支持PHP的开发。
8)目前已经很多大型应用都是使用PHP,比如淘宝网、Yahoo、163、Sina等等大型门户,很多选用PHP来作为他们的开发语言,所以大型门户都能够选用它,我想足够能够你的使用了。
9)有很多开源的框架或开源的系统可以使用,比如比较知名的开源框架有Zend Framework、CakePHP、CodeIgniter、symfony等,开源论坛有Discuz!、Phpwind等,开源博客 WordPress,开源网店系统如Ecshop、ShopEx等,开源的SNS系统如UCHome、ThinkSNS等。
10)使用成本低 (linux apache mysql php内核)
2.缺点
1)函数命名不规范 驼峰法和下滑线,传参位置不一 你知道的
2)单线程 ; PHP本身,一直以来php就是个单进程的程序;虽然php的pthreads扩展早就有了。但是它不够稳定,运行运行着就会莫名其妙的自己挂掉;php的扩展都是C写的,这也就意味着任何一个扩展出现线程竞争资源控制问题都能让整个挂掉
3)核心异步网络不支持(当然在linux只有同步非阻塞网络模型)。却少了这个使得很难开发一个能够承受大并发的网络应用。传统的网络模型和io都阻塞的。这样基本的编程的做法就是一个进程(或者线程)响应一个用户链接请求。因此无法完成像实时网游那样需要成千上万网络连接的任务。尽管php也有Libevent、eio扩展对此算是某种程度上面的弥补,但是感觉都不是那么完善
4)只支持web开发,不方便做 .exe文件,不方便做桌面应用程序. 不方便做手机程序.
5)不适合做爬虫、自动运行脚本.科学运算项目,这语言基本构架就不适合,虽然有很多方法实现。
6)后期维护困难。后期提速空间局限性较大。
在对PHP有一个大致的认识以后,我们来了解一下为什么说PHP慢?
PHP的慢是相对于C/C++级别的语言来说,事实上,PHP语言最初的设计,就不是用来解决计算密集型的应用场景。我们可以这样粗略理解为,PHP为了提升开发效率,而牺牲了执行效率。
我们知道PHP一个很大的特点,就是弱类型特性,也就是说,我可以随意定义一个变量,然后给它随意赋值为各种类型的数据。以一个int整型数字为例子,在C语言中:
int num = 200; // 通常是4字节
但是,如果是PHP定义了一个同样的变量,实际对应的存储结构则是:
这个结构体将会占据远比C变量多得多的内存,PHP中定义方式如下:
$a = 200; //这变量将实际占用对比C变量很多倍的存储空间。
其实对PHP来说,无论存储什么类型的数据,都是用上述“通杀”的结构体实现。为了兼容PHP程序员的变量类型“乱入”,PHP做到了对开发者的友好,但是对执行引擎很残酷。单个变量内存消耗可能还不明显,一旦用到PHP的数组等,则复杂度指数上升(数组的实现是HashTable)。然后,Zend引擎执行时,将这些PHP代码编译为opcode(PHP的中间字节码,格式有点类似于汇编),由Zend引擎逐行解释执行。
无论是字符串的连接操作,还是数组的简单修改等,几乎都是“PHP程序员一句话,Zend引擎跑断腿”的节奏。因此,同样的操作,对比C来说,PHP消耗了更多的CPU和内存等系统资源。除此之外,还有内存自动回收、变量类型判断等等,都会增加系统资源的消耗。
例如,我用纯PHP实现的快速排序函数和原生sort函数,排序10000个整型数字,来做一个耗时对比,结果如下:
原生的sort耗时3.44 ms,而我们自己实现的PHP函数sort则是68.79 ms。我们发现,两者执行效率差距巨大。我的测试方式,是计算函数执行前后的时间间隔,而不是整个PHP脚本从启动到结束的时间。PHP脚本启动和关闭过程,本身有着一系列的初始化和清理工作,也会占据不少的耗时。
通常情况下,PHP执行效率的排行是:
最快的是PHP语言结构(isset、echo等),PHP语言的一部分(它们根本不是函数)。
然后比较快的就是PHP的原生和拓展函数。PHP拓展,基于Zend API之上,用C实现的功能,执行效率和C /Java是属于同一个数量级的。
真正慢的就是,我们通过PHP自己写的代码和函数。例如,假如我们使用的比较重的纯PHP实现的框架,因为框架本身的模块很多,所以,会明显拖累语言层面的执行效率,同时占据更多的内存。(国内的Yaf框架,以拓展的方式实现,因此执行效率远快于纯PHP写的框架。
在一般情况下,我们并不推荐用过PHP实现逻辑复杂计算类型的功能,尤其是Web系统流量比较大的场景下。因此,PHP程序员应该对PHP的各种原生函数和各类拓展有一个比较广泛的了解,在具体的功能实现场景中,寻求更原生的解决方案(原生接口或者拓展),而不是自己写一堆复杂的PHP代码来实现这类型功能。
如果有足够的PHP拓展开发实力,将这类型业务功能重写为一个PHP拓展,也会大幅提升代码的执行效率。这是一个非常不错的方式,也被广泛应用PHP优化中。但是,自己编写的PHP业务拓展的缺点也很明显:
拓展开发耗时比较长,需求变更的时候修改也复杂,写得不好可能会影响Web服务稳定性。(例如,在Apache的worker模式下,多线程场景下挂掉,会影响同一个进程下的其他正常子线程。如果是多线程的Web模式,编写拓展还需要支持线程安全)
拓展在PHP版本升级的时候,可能需要做额外的兼容工作。
人员变动后的维护和接手成本也比较高。
实际上,在互联网一线企业中,更常见的解决方案,并非增加PHP拓展,而用C/C 独立写一个服务server,然后PHP通过socket和服务server通信来完成业务处理,并不将PHP本身和业务耦合在一起。
不过,Web服务大部分的性能瓶颈都在网络传输和其他服务server的耗时上(例如MySQL等),PHP执行的耗时在整体耗时的占用比例非常小,所以从业务角度来说,影响可能并不明显。
python如何利用requests和bs4爬取图片?
试着理一下思路。
一般,使用requests发起请求,将目标网页请求过来。当然有可能经过了代理,跳转,认证,对requests都不是问题。接着说BS4爬取图片。
BeautifulSoup4是将html看做一棵树,对其进行结构解析,定位节点,寻找值。这个是建立在完整的html结构体系内。其使用lxml,html5lib等库用作解析引擎。
类似的,仿照jQuery,有大神制作了PyQuery,使用jq的语法操作DOM。
下面说一下,集中情况,如何获取网页内容:
静态页面。直接使用BS4就是。
动态页面,如PHP/Java等使用模板引擎生成的网页。结构一般也较为清晰。可以看做是静态页面。
重js页面。这样的页面一般由前端完成,网页极不易获取,动态变化较大。可能需要其他工具模仿请求,比如selenium。这时候可能用不到requests/bs4。例如必应中文首页背景图。
前端渲染的页面。如
vue.js
,react.js
脚手架搭建的网页,不可能用题主所使用的两个工具拿到数据。phantomjs可以用于此场景。当然,如果使用实际的chrome driver,使用selenium请求数据,也完全没问题。防盗链图片类资源。例如微信公众号平台的文章图片,做了防盗链措施。bs4仅用于获取image url,url地址也就没有再次使用的价值。
上面5条,都是在说网页应用。网页在不同的浏览器,PC的谷歌,火狐,Opera,IE等,手机端的浏览器,均可使用此方法。
下面说一下,抓取APP端应用的数据。两类平台,一个Android,一个IOS。因为IOS的封闭性,操作起来极为不便。以安卓为例,因为同样的功能,安卓端大致相同,且安卓手机普及率较高,较为容易获得。且开放性,定制性较好。Python的话,需要使用不同的库,解析Android页面,比如poco。就不展开说了。
以上。
想想自学计算机不知道往哪方向发展?
计算机学习的精髓在于应用,如果能够跟所从事的工作相结合,把学习到的知识用到工作当中,那就更好了。以实际应用检验学习的效果,这样学习更有针对性,能够给学习带来更大的动力和成就感,这种进步是指数级增长。
计算机应用和office办公软件属于通用技能,市场更大,就业领域更广,适应性更强,遍布各行各业。
不过我们还要看到的是,职场的竞争是多维度的竞争,你的通用技能,专业技能,认知高度,思维深度,加上你的背景,资源和其他能够为你带来价值的东西,才真正决定了你的价格。
如果想找学习资料,买本计算机基础就行,关注计算机及办公软件应用方面公众号,保持与行业内的互动交流、刻意练习是你学习的很好途径,如果能教会别人那就最好不过了。不用关注太多,信息过载会占用大量时间和精力,保持专注和韧劲,持续努力,剩下的就交给时间吧。
希望对你有帮助。
python哪个就业环境好?
先说下本人情况,研究生学历,计算机非科班程序猿。个人也是比较奇葩的存在,第一是毕业的时候一直想找算法或者人工智能,奈何学校差,一般好点的公司都不给offer,所以从事java开发了,但是有一颗算法开发不死之心。我做过web前端(vue开发),感觉还行,不错目前react更加多岗位,尤其是大公司.。python不用说了,我学的还不错,在web开发,爬虫,人工智能上用的多,如果有学历且学校好,可以做python,需求也大,还是没有java大,哈哈哈哈。前端的话,技术迭代快,学的也多,但是有成就感,市场也还可以。php用过,在小中型公司多,前景现在不好了
还有哪些主流开发需要以及用在哪些开发方面?
其实在回答这问题之前,我们应该看看如何定义主流?主流开发的语言有哪些?这有没有一个统一的标准呢?毕竟计算机发展了几十年里,涌现出了太多的编程语言,如果你经常看 TIOBE 编程语言排行榜的话,你会发现,有太多的编程语言了。
而如何定义主流编程语言呢?我认为主流的编程语言,之所以称得上为主流,最起码应该有如下两个特点:
1、在语言排行榜的前 20 名在语言排行榜的前 20 名里,这就意味着使用这门编程语言的人比较多,用的人比较多,肯定算得上主流。毕竟大多数都在用,都在流行的语言,就可以称得上为主流的意思。
如果一个语言,极少数人用,不经常提到,肯定不能算主流啊!这个道理应该是浅显易懂的。
2、至少稳定 3-5年什么意思呢?就是这门语言在排行榜上必须稳定 3-5年的时间,至少 3 年,为什么?如果一门语言,就一个月进入了排行榜前 20 名,其余的时间都没有入围,也不能算主流语言,昙花一现的语言,还没有发展起来,形成自己完成的生态,以及没有形成众多开发者的拥护,就低落了,也不能算主流编程语言。
稳定性,也是衡量这门开发语言是否主流的标准,越稳定,这门语言的发展就越好,生态就会越完善,用的人就会越来越多,就会成为大家选择编程语言的首选,说明市场对这门语言是认可和看重的。
标准定下来,那么我们就来看看语言排行榜上有哪些语言呢?最新一期 2019 年 11 月公布的语言排行榜。
TIOBE 编程语言排行榜
对,首先映入眼帘的就是题主所说的,Java 和 C ,这两门语言常年霸占在语言排行榜的前三名。所以,肯定是主流的开发语言了。
后面的 Python 是近两年随着人工智能的火爆,迅速发展起来的,现在的适用人群很大,也非常流行,这几年及未来肯定还会在这个榜单上,所以,Pyhon 是主流的开发语言,主要用于人工智能,爬虫,后台等等很多开发都可以用它。
C++更不用说了,它的功能更是非常重要,就现在的形势而言 C++ 的用处还是挺大的,特别是一些嵌入式系统或一些系统底层的东西用 C/C++ 。
Swift 是 OC 的替代品,所以,Swift 和 OC 目前用于苹果相关的开发比较多,比如 iOS 端的应用就是用它们开发的。
JS 主要是用于前端的开发,这个不用太介绍了,只要是程序员肯定都知道,但是它跟 Java 是没有关系的哈。
Go 这几年也是非常火的。Go 语言主要用作服务器端开发,其定位是用来开发 “大型软件” 的,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go 语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go 语言广泛应用于 Web 应用、API 应用、下载应用等;除此之外,Go 语言还可用于内存数据库和云平台领域,目前国外很多云平台都是采用 Go 开发。
具体其他的我就不一样介绍了,最起码我上面列出来的这几门语言绝对是非常非常流行的主流的编程语言。
回答不易,欢迎大家给我的回答点赞,支持我一下。