首页 开发编程 正文

php怎么写爬虫(PHP在爬虫方面不擅长吗)

这是因为用Python写代码从互联网抓数据实在太简单了。今天写的这个小程序没有借助任何爬虫框架,原汁原味地用Python实现了一个能自动探索网站的爬虫程序。我们使用队列去做URL存储以便更加容易的实现自动化。爬虫主体从队列中拿到URL,如何使用HTTP协议方法从Web站点上获取信息。如何抽取URL和我们感兴趣的结构化数据。Simple...

PHP在爬虫方面不擅长吗?

没有什么擅不擅长的 php xpath(这货可以像写jquery选择器一样抓取页面元素! 还在靠写正则表达式来取元素?Out!) curl pthread或swoole 一起上 要多爽有多爽!只是说一般人不这么玩而已!

如何编写Python程序的爬取信息?

昨天刚刚概念性的回答了爬虫怎样断点续传的问题,今天看到你这个提问就突然产生把昨天构思的爬虫构架实现的冲动。希望下面我这些用心写出的内容能够解答你的问题。

都说Python是做爬虫绝好的工具,这是因为用Python写代码从互联网抓数据实在太简单了。今天我用个简单的小例子带大家看一看,怎样用Python去网站上爬取信息。爬虫英语叫做Spider,因为蜘蛛会在网上爬来爬去,每个角落都有它的足迹,互联网上的Spider行为也是一样的,它会探索网站的每个角落,去抓取感兴趣的信息。作为一篇新手向的指导,我没有向大家介绍Scrapy这些框架,一上来就讲框架往往会让人忽视问题的本质,今天写的这个小程序没有借助任何爬虫框架,原汁原味地用Python实现了一个能自动探索网站的爬虫程序。

爬虫的架构设计

爬虫应当具备两个基本能力,一是从网页中发现URL,以便于探索更多的页面;二是从网页提取我们想要的数据,这也是开发爬虫的根本目的。

一个典型的爬虫应当具有下图这样的架构。

我们使用队列去做URL存储以便更加容易的实现自动化。如下图所示,在队列的tail加入待处理的URL(入队enqueue),然后从head取出URL进行处理(出队dequeue)。

第一次运行程序,我们放入一个种子URL到队列中,爬虫主体从队列中拿到URL,通过和待抓取网站交互获取到新的URL,再次放入到URL队列中,同时把需要解析的数据存储到数据库。这便形成了一个自循环系统,只需要设计好URL抽取算法,爬虫可以完全自动化的工作起来了!这样看来,我们开发爬虫需要掌握下面的知识,如果1你还不了解,可以先去百度科普一下,本文的介绍会涉及2~4的相关知识:Web网站的基本结构,HTTP和HTML相关知识。如何使用HTTP协议方法从Web站点上获取信息。如何抽取URL和我们感兴趣的结构化数据。如何存储数据。

设计程序框架

根据架构图,我们使用Python的Queue库作为URL队伍使用,新建一个爬虫主体类,我们命名为SimpleSpider。SimpleSpider的主要功能是从队伍中取URL、获取网页并从中提取URL和数据、将URL放入队列等功能。代码框架如下图所示。

实现URL队列

为了让SimpleSpider代码先能跑得通,我们得先把URL队列实现了。Queue库很简单,我们在加入以下几行代码,便完成了队列的功能。这里还简单实现了一个去重机制(注意这种使用list去重方法效率很低而且会占用大量内存,实际项目需要用其它方式实现)。

可以注意到在初始化时把news.baidu.com加入了URL队列,也就是我们爬虫的起始种子URL是news.baidu.com。

实现网页下载

需要使用HTTP协议同网站服务器沟通才能下载下来网页,Python中最为流行的HTTP库是requests,它的功能很强大,详细的使用方法可以参考它的中文文档(http://docs.python-requests.org/zh_CN/latest/user/quickstart.html)。这里只用到它很简单的一个get方法,在程序中继续加入以下代码,便实现了文档下载的功能。需要提醒的是,requests并非Python的标准库,需要运行pip install requests安装。

然后,我们在程序的尾部加上以下代码,来做一个简单的测试:

Bingo,百度新闻主页下载下来并打印出来了!请注意,我们的document变量里存的是网页的源代码,因此后面的分析也是基于源代码进行的。

实现提取URL和数据,并保存到磁盘

提取数据,可用的方法非常的多,比如正则表达式、BeautifulSoup、XPath、CssPath等都很强大,今天只简单介绍下正则表达式。正则表达式如果想到熟练其实并不容易,不过今天教大家一个“万金油”式的用法,足够应付开发爬虫最初期的需要了,那就是模糊匹配:

使用点(.)表示任意字符,使用星号(*)表示任意长度,使用问号(?)表示匹配最近的一个后续字符串,然后使用括号把你想要的数据括起来。

现在我们想要提取URL,实际上就是把网页上的<a href="http://www.baidu.com" ... >中的href=""两个引号中间的内容取出来,写成正则表达式就是:

'<a href="(.*?)"'

现在我们要把源代码中所有包含new.baidu.com的URL提取出来,并重新放入URL队列中:

提取数据的方法想必大家也都猜出来了。通过观察百度新闻主页发现,所有指向真正新闻内容的URL都链接到其它新闻发布站点上了,而且它们都在新窗口中打开(包含了_blank标记)。下面就按照这个规律把所有新闻的标题和网址提取出来,并组织成这样的一个数据结构:{"title":"新闻标题","url":"http://xxxxx"}保存到磁盘。代码如下,数据被保存在output.txt文件中。

完成并测试我们的爬虫

最后,需要实现run方法,把我们的爬虫跑起来。判定只要队列不是空就一直循环,它完成3步操作:第1步,下载网页,第2步,提取网页中我们需要的URL,第3步,提取数据。我们用一个print语句把处理的结果输出到屏幕上。启动后爬虫开始全自动的工作,仔细去探索百度新闻网站。

这是提取出来的数据保存到磁盘上的结果:

由于百度新闻数据量极大,加上我们没有很好的过滤掉无用的代码,不出意外的话,这个爬虫会运行很久才停下来(我已经跑了1小时队列里已经积压了5000多个URL了[汗],后面有机会我会告诉大家如何用多线程去极大的提高URL队列的处理速度)。如果等不及了想看结果请直接按Ctrl+C结束进程。开发真正实用的爬虫时,需要仔细去设计跳出循环的机制。这个小爬虫程序是我专门为回答此问题编写的,如果觉得帮到了你请帮忙点赞呦!大家可以照着指示写下来应该不会有问题,或者不想动手敲代码可以加粉私信我,我会一一回复源代码的下载地址。也希望大家能多多转发,大家的支持是我坚持写下去的唯一动力!

你是如何高效写“爬虫”的?

当然是不写代码呗,有现成的爬虫软件可以直接使用,就没必要在一行一行的撸码了,下面我简单介绍2个爬虫软件—Excel和八爪鱼,这2个软件都可以快速抓取网页数据,而且使用起来也非常简单:

Excel

利用Excel爬取网页数据,这个大部分人都应该听说或使用过,对于一些简单规整的静态网页数据,像表格数据等,可以直接使用Excel外部链接导入,下面我简单介绍一下这种方式:

1.这里以爬取http://www.pm25.in/rank上的PM2.5数据为例,都是规整的表格数据,如下:

2.新建一个excel文件并打开,依次点击菜单栏的“数据”->“自网站”,如下:

3.接着在弹出的窗口输入上面的网页链接地址,点击“转到”按钮,就会自动打开网页,如下:

4.最后,我们点击右下角的“导入”按钮,就能将网页中的表格数据导入到Excel文件中,如下,非常方便,也不需要我们再次整理:

八爪鱼

这个是比较专业的一个爬虫软件,对于复杂、动态加载数据的网页来说,可以使用这个软件进行抓取,下面我简单介绍一下这个软件:

1.首先,下载安装八爪鱼软件,这个直接到官网上下载就行,如下:

2.安装完成后,我们就可以利用这个软件爬取网页数据了,首先,打开这个软件,在主页中选择“自定义采集”,如下:

3.接着在任务页面,输入我们需要爬取的网页,这里以爬取智联招聘上的数据为例,如下:

4.点击保存按钮,就会自动跳转到对应网页并打开,效果如下,这里我们就可以直接选择我们需要爬取的网页数据,非常简单,按照操作提示一步一步往下走就行:

5.最后点击保存并开始采集,启动本地采集,就能自动爬取刚才选中的数据,如下:

这里你也根据自己需要,选择数据导出的格式,Excel、CSV、HTML、数据库等都可以,如下:

至此,我们就完成了利用Excel和八爪鱼来爬取网页数据。总的来说,这2个爬虫软件使用起来都非常不错,也容易学习和掌握,只要你熟悉一下操作,很快就能掌握的,当然,如果你有一定的编程基础,也可以通过编程来实现网页爬虫,像Java、Python等都可以,感兴趣的话,可以自己尝试一下,网上也有丰富的教程和资料可供参考,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言。

想学python网络爬虫,应该怎么开始?怎么应用到实际的工作中?

学习Python爬虫首先要具备一些必备知识,

Python

html

正则表达式

Python是我们用于爬虫的工具,结合requests、BeautifulSoup等第三方工具包可以实现程序的开发。而html是我们要爬的目标,需要了解其中标签的含义。另外,在爬虫过程中需要很多字段和标签的匹配,这会经常用到正则表达式。

当然,一个成熟的爬虫需要的技能远不止这些技能。下面我就以最简单的思路,逐步介绍一下如何开始爬虫,保证一文看完就能明白。

前言就如同标题指明的那样,本文主要针对入门,如果寻求进阶,或者在爬虫方面走的更远,本文提供的帮助是微乎其微的,本文的主要目的就是用简单的方式、简单的语言帮助对网页爬虫感兴趣的同学。目前网上有关网页爬虫的指导有很多,但是套路却是千篇一律,基本都是围绕以下内容进行展开,CSS/html等网页知识requests或urllibBeautifulSoup或正则表达式Selenium或者Scrapy对于我来说,学习爬虫知识一项获取数据的工具,而不是工作的主要内容,因此,没有太多的时间花费在上述知识成体系的学习上面。上述提到的每块都涉及大量的知识,一段时间的学习之后容易让人陷入"云里雾里",然后就丧失了学习的兴趣,没有全局观、没有重点,最终使得学习效率非常低下。本文不详细的讲解什么是CSS/html,怎么用requests或者urllib,本文主要目的是介绍怎么去爬取一个网站、爬取我们需要的资源,可能会用到上述一个或几个模块里的知识,对我们用到的功能了解即可,没有必要从头至尾的学习一遍,希望能够用这种方法让对爬虫感兴趣的同学对这项技术有一个统筹的认识,能够满足日常获取数据的需求,如果想要在这项技术上深入研究,可以后续学习其他成体系的课程,对上述模块认真、详细的学习。准备工作很多网页爬虫的教程中使用或者提及到很多工具,本文选择以下几项工具,网页浏览器(Google Chrome)BeautifulSoup4requests网页浏览器主要用于查看网页html源码和检查网页单元使用,浏览器有很多,谷歌、火狐、IE等,每个人的喜好不同,可以根据自己的日常习惯进行选择,本文以Google Chrome为例进行讲解。BeautifulSoup4是一个HTML、XML的解析器,它能够轻而易举的解析web网页,从中获取我们想要的单元和信息,能够避免筛选信息时的麻烦,它能够提供用于迭代、搜索、修改解析树的用法。在网页匹配过程中BeautifulSoup的速度并不比正则表达式快,甚至还要慢一些,但是它最大的优势就是简单、便捷,因此是很多网页爬虫工程中的必选工具之一。安装$ pip install beautifulsoup4requests是Python大神Kenneth Reitz的力作,是一个用于网络请求的第三方库,Python已经内容了urllib模块用于访问网络资源,但是使用起来相对麻烦,而requests相比之下要方便快捷很多,因此本文选择用requests进行网络请求。安装$ pip install requests动手实践很多教程选择爬取糗事百科、网页图片,本文就选取另外一个方向,爬取我们常用的百度百科,这样更加直观、易于理解。经常浏览网页,注意细节或者善于总结的会发现,网址主要有两部分组成,基础部分,和对应词条的后缀,例如上述百科词条,由基础部分https://baike.baidu.com组成,后缀是item/林志玲/172898?fr=aladdin,因此我们要爬取一个网站首先要获取一个网址。第一步,要确定一个目标,你要爬取什么数据?很多人会认为,这不是废话吗?我个人认为这是很重要的,有目的才会效率更好,在没有某种目标驱动的情况下,就很难带着问题和压力去做一件事情,这样会变得漫无目的,导致效率很低,因此,我认为最重要的是首先要清楚想爬取什么数据?网页上的音乐图片素材...本文就以爬取百度百科词条内部链接和下载图片为目标进行讲解。第二步,我们要获取一个基础的网址,百度百科的基础网址,https://baike.baidu.com/第三步,打开首页,以林志玲的百度词条为首页开始爬取。第四步,查看源码,很多人都知道查看源码的快捷键是F12,不管是谷歌浏览器还是IE浏览器,都是这样,但是当按下F12之后会不由得疑问,"这是什么东西?",令人毫无头绪。当然,可以一步一步的去了解源码,学习html的知识,然后用正则表达式去一步一步、一个单元一个单元的匹配我们想要的信息,但是这样未免太复杂了,我个人推荐使用检查工具。爬取内部链接指向我们想要了解的元素,素,鼠标右键->检查,能够快速定位我们关注的元素。我觉得到这一步就已经够了,最简单的网页爬虫就是反复的重复以下两个步骤:检查定位我们想要的元素和属性BeautifulSoup4匹配我们要的信息通过检查功能可以看到,百科词条内部链接部分的源码是这样的,元素1:<a href="/item/%E5%87%AF%E6%B8%A5%E6%A8%A1%E7%89%B9%E7%BB%8F%E7%BA%AA%E5%85%AC%E5%8F%B8/5666862" data-lemmaid="5666862">凯渥模特经纪公司</a>元素2:<a href="/item/%E5%86%B3%E6%88%98%E5%88%B9%E9%A9%AC%E9%95%87/1542991" data-lemmaid="1542991">决战刹马镇</a>元素3:<a href="/item/%E6%9C%88%E4%B9%8B%E6%81%8B%E4%BA%BA/10485259" data-lemmaid="10485259">月之恋人</a>元素4:<a href="/item/AKIRA/23276012" data-lemmaid="23276012">AKIRA</a>从上述4个元素可以看出,我们想要的信息词条内部链接在标签<a></a>中,标签中有以下几个属性:target:这个属性贵姓在何处打开链接文档,_blank标明浏览器总在一个新标签页载入目标文档,也就是链接href指向的文档。href:前面已经提过很多次,属性href用于指定超链接目标的链接,如果用户选中了标签<a></a>中的内容,则会尝试打开并显示href指定链接的文档。data-*:这是html的新特性可以存储用户自定义的属性。可以看出,我们想要的信息就在href中,也就是词条的内部链接。因此,我们爬虫的目标就很明确了,就是解析出href超链接。到这里,浏览器检查功能已经发挥了它的作用,下一步问题就变成了我们怎么解析出标签中href的链接?这时,BeautifulSoup4就派上用场了。用BeautifulSoup4解析我们从网页上抓取的html,soup = BeautifulSoup(response.text, 'html.parser')看到这里也许会疑惑,html.parser是什么?这是一种html的解析器,Python中提供几种html解析器,它们的主要特点分别是,综合来说,我们选取html.parser解析器,选取好解析器之后就开始着手匹配我们想要的元素,可是看一下html发现,网页中有很多<a></a>标签,我们该匹配哪一类呢?<a href="/item/AKIRA/23276012" data-lemmaid="23276012">AKIRA</a>仔细看一下会发现特点,,属性href以/item开头的,于是就有了我们的匹配条件,{"target": "_blank", "href": re.compile("/item/(%.{2})+$")}用这样的匹配条件去匹配符合target、href要求的标签<a></a>,sub_urls = soup.find_all("a", {"target": "_blank", "href": re.compile("/item/(%.{2})+$")})完整代码为,def main(): url = BASE_URL + START_PAGE response = sessions.post(url) response.encoding = response.apparent_encoding soup = BeautifulSoup(response.text, 'html.parser') sub_urls = soup.find_all("a", {"target": "_blank", "href": re.compile("/item/(%.{2})+$")}) for sub_url in sub_urls: print(sub_url)输出结果为,<a href="/item/%E5%B9%B8%E7%A6%8F%E9%A2%9D%E5%BA%A6" >幸福额度</a><a href="/item/%E5%8C%97%E4%BA%AC%C2%B7%E7%BA%BD%E7%BA%A6" >北京·纽约</a><a href="/item/%E5%A4%9A%E4%BC%A6%E5%A4%9A%E5%A4%A7%E5%AD%A6" >多伦多大学</a><a href="/item/%E5%88%BA%E9%99%B5" >刺陵</a><a href="/item/%E5%86%B3%E6%88%98%E5%88%B9%E9%A9%AC%E9%95%87" >决战刹马镇</a><a href="/item/%E5%8C%97%E4%BA%AC%C2%B7%E7%BA%BD%E7%BA%A6" >北京·纽约</a><a href="/item/%E5%BC%A0%E5%9B%BD%E8%8D%A3" >张国荣</a><a href="/item/%E5%A5%A5%E9%BB%9B%E4%B8%BD%C2%B7%E8%B5%AB%E6%9C%AC" >奥黛丽·赫本</a><a href="/item/%E6%9E%97%E5%81%A5%E5%AF%B0" >林健寰</a><a href="/item/%E6%96%AF%E7%89%B9%E7%BD%97%E6%81%A9%E4%B8%AD%E5%AD%A6" >斯特罗恩中学</a><a href="/item/%E5%A4%9A%E4%BC%A6%E5%A4%9A%E5%A4%A7%E5%AD%A6" >多伦多大学</a><a href="/item/%E5%8D%8E%E5%86%88%E8%89%BA%E6%A0%A1" >华冈艺校</a><a href="/item/%E5%94%90%E5%AE%89%E9%BA%92" >唐安麒</a><a href="/item/%E6%97%A5%E6%9C%AC%E5%86%8D%E5%8F%91%E7%8E%B0" >日本再发现</a><a href="/item/%E4%BA%9A%E5%A4%AA%E5%BD%B1%E5%B1%95" >亚太影展</a><a href="/item/%E6%A2%81%E6%9C%9D%E4%BC%9F" >梁朝伟</a><a href="/item/%E9%87%91%E5%9F%8E%E6%AD%A6" >金城武</a>......在用属性字段sub_url["href"]过滤一下即可,/item/%E5%B9%B8%E7%A6%8F%E9%A2%9D%E5%BA%A6/item/%E5%8C%97%E4%BA%AC%C2%B7%E7%BA%BD%E7%BA%A6/item/%E5%A4%9A%E4%BC%A6%E5%A4%9A%E5%A4%A7%E5%AD%A6/item/%E5%88%BA%E9%99%B5/item/%E5%86%B3%E6%88%98%E5%88%B9%E9%A9%AC%E9%95%87/item/%E5%8C%97%E4%BA%AC%C2%B7%E7%BA%BD%E7%BA%A6/item/%E5%BC%A0%E5%9B%BD%E8%8D%A3......就得到了词条内部链接的后缀部分,然后和基础的url拼接在一起就是完整的内部链接地址。同理,用同样的方法也可以爬取其他内容,比如糗事百科的笑话、专业网站的素材、百度百科的词条,当然,有些文本信息比较杂乱,这个过程中需要一些信息的筛选过程,例如利用正则表达式来匹配一段文本中有价值的信息,方法与上述大同小异。下载图片和爬取内部链接一样,要善于利用浏览器的检查功能,检查一下词条内部图片的链接,<img class="picture" src="https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D220/sign=85844ee8de0735fa95f049bbae500f9f/dbb44aed2e738bd49d805ec2ab8b87d6267ff9a4.jpg" style="width:198px;height:220px;">发现,图片链接存放在<img></img>标签内部,用上述方法可以匹配到图片的完整链接,url = BASE_URL + START_PAGE response = sessions.post(url) response.encoding = response.apparent_encoding soup = BeautifulSoup(response.text, "html.parser") image_urls = soup.find_all("img", {"class": "picture"}) for image_url in image_urls: print(image_url["src"])输出如下,https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D220/sign=36dbb0f7e1f81a4c2232ebcbe7286029/a2cc7cd98d1001e903e9168cb20e7bec55e7975f.jpg https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D220/sign=85844ee8de0735fa95f049bbae500f9f/dbb44aed2e738bd49d805ec2ab8b87d6267ff9a4.jpg ...然后用requests发送请求,获取图片的数据,然后以读写文件的方式存储到本地,for image_url in image_urls: url = image_url["src"] response = requests.get(url, headers=headers) with open(url[-10:], 'wb') as f: f.write(response.content)

除了requests之外,还可以使用urllib.request.urlretrieve下载图片,urlretrieve相对要方便一些,但是对于大文件,requests可以分段读写,更具有优势。

上述介绍的方法是比较简单的一种,如果精力有限也可以尝试一下Selenium或者Scrapy,这两款工具的确非常强大,尤其是Selenium,它本是一款自动化测试工具,但是后来发现它同样可以用于网页爬虫,让浏览器帮助你自动爬取数据的工具,它可以以用户访问网页类似的行为去浏览网页并抓取数据,非常高效,感兴趣的可以尝试一下。

想自己动手写网络爬虫,但是不会python,可以么?

网络爬虫只是一种按一定规则自动获取互联网数据的方式,不仅仅只是Python,其他编程语言,像Java、Php、Node等都可以轻松实现,只不过相比较Python来说,开发工具包比较少而已,下面我简单介绍一下学习Python爬虫的过程,感兴趣的朋友可以尝试一下:

01Python基础

这里主要是针对没有任何Python编程基础的朋友,要学习Python爬虫,首先,最基本的就是要掌握Python常见语法,包括变量、元组、字典、列表、函数、类、文件处理、正则表达式等,这个网上教程非常多,直接搜索就能找到,包括菜鸟教程、慕课网、网易云课堂等,花个三四天时间学习一下,非常容易入门,也好掌握:

02爬虫入门

Python基础掌握差不多后,就是爬虫入门,初学的话,可以使用urllib、requests、bs4、lxml等基础爬虫库,简单易学,容易掌握,而且官方自带有非常详细的入门教程,非常适合初学者,对于爬取一些常见的web页面或网站来说,可以说是手到擒来,非常简单,先请求数据,然后再解析就行:

03爬虫框架

爬虫基础掌握差不多后,就可以学习爬虫框架了,比较流行的就是scrapy,一个免费、开源、跨平台的Python爬虫库,在业界非常受欢迎,可定制化程度非常高,只需添加少量代码就可轻松开启一个爬虫程序,相比较requests、bs4等基础库来说,可以明显提高开发效率,避免重复造轮子,建议学习一下,非常不错,很快你就会爱上这个框架:

目前就分享这3个方面吧,初学Python爬虫的话,建议还是多看多练习,以积累经验为主,后期熟悉后,可以结合pandas、matplotlib对数据做一些简单的处理和可视化,网上也有相关教程和资料,介绍的非常详细,感兴趣的话,可以搜一下,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言进行补充。

本文转载自互联网,如有侵权,联系删除