使用多个Python库开发网页爬虫(一)

21CTO社区导读:在本篇文章里,我们将讨论使用Python进行网页抓取以及如何引用多个库,如Beautifusoup,Selenium库,以及JavaScript的PhantomJS库来抓取网页。

在本文中,我们将学习到如何抓取静态页面,Ajax内容、iFrame、处理Cookie等内容。

关于网页抓取

网页抓取是从Web中提取数据的过程,可以用于分析数据,提取有用的信息。

可以将抓取的数据存储到数据库里,也可以保存为任何格式的文件格式,比如CSV,XLS等,可用于其它软件再编辑。

在Python语言的世界中,抓取的数据还可以传给类似NLTK这样的库,以进一步处理。

综合来讲,网页抓取可以帮助我们从不同的页面中下载数据,能够创造更多的价值,让更多的人们受益。

您可能会想,为啥我们不用Google来抓取网页呢?我们不用在此发明轮子,网页抓取不是用来开发搜索引擎。

我们可以抓取竞争对手的网页,分析数据,掌握他们的客户对产品的满意度,有了抓取,这一切都是免费的。比如像Moz这样的搜索引擎优化工具可以分解和抓取整个网络,处理和分析数据,这样我们就可以看到人们的兴趣以及如何在同一领域与其他个竞品做比较。

总体而言,网页抓取好处多多。

如何使用BeautifulSoup

假设你有一些Python的基础知识,我们将BeautifulSoup做为第一个网页抓取库。

下面开始安装 BeautifulSoup,可以使用pip,可以使用源码方式安装。如:

pipinstall beautifulsoup4

检查它是否安装成功,请使用你的Python编辑器输入如下内容检测:

frombs4 import BeautifulSoap

然后运行它:

pythonmyfile.py

如果运行没有错误 ,则意味着BeautifulSoup安装成功。现在让我们看看如何使用Beautifulsoup。

第一个网页爬虫

fromurllib.request import urlopen

frombs4 import BeautifulSoup

html= urlopen("https://www.python.org/")

res =BeautifulSoup(html.read(),"html5lib");

print(res.title)

该程序执行结果如下:

我们使用urlopen连接要抓取的网址,然后使用html.read()方法读取和返回HTML。返回的HTML内容会被转换为具有层次结构的BeautifulSoup对象,如果想提取HTML中的内容,只需要知道包围它的标签就可以获得。我们稍后就会介绍。

处理HTTP异常

一旦有任何错误,urlopen都会返回一些错误信息。比如没有找到页面,有可能是404错误,还有500内部服务器错误,这些错误会导致脚本崩溃,我们使用如下代码处理异常:

fromurllib.request

importurlopen from urllib.error

importHTTPError from bs4

importBeautifulSoup

try:html = urlopen("https://www.python.org/")

except HTTPError as e: print(e)

else:

res =BeautifulSoup(html.read(),"html5lib")

print(res.title)

这样就能解决以上的问题。但是如果服务器关了,或者域名输入不对怎么处理?

处理URL异常

若出现网站不能访问,会返回URLError的网络异常,代码做如下处理:

from urllib.request

importurlopen from urllib.error

importHTTPError from urllib.error

importURLError from bs4 import BeautifulSoup

try: html =urlopen("https://www.python.org/")

except HTTPError as e: print(e) exceptURLError:

print("Serverdown or incorrect domain")

else:res = BeautifulSoup(html.read(),"html5lib")

print(res.titles)

接下来,我们需要拿到返回的HTML标签,可能返回的不正常的HTML标签,也可能抓取的页面没有标签,Python会返回一个None对象。

可以用一个简单的if语句来处理。如下代码:

from urllib.request

import urlopen from urllib.error

import HTTPError from urllib.error

import URLError from bs4

import BeautifulSoup

try:html = urlopen("https://www.python.org/")

except HTTPError as e: print(e) exceptURLError: print("Server down or incorrect domain")

else: res =BeautifulSoup(html.read(),"html5lib")

ifres.title is None: print("Tag not found")

else:print(res.title)

看起来很棒,我们的爬虫做得很好。现在,我们就可以抓取整个页面或某个特定的标签了。

但是,如果是更复杂的标签该怎样处理?

使用BeautifulSoup按分类搜索

现在我们尝试通过基于CSS类来抓取一些HTML元素。BeautifulSoup对象有一个名为findAll的函数,它可以根据CSS属性提取或过滤元素。

可以像以下的代码来过滤所有class类为“post-title”的H3元素:

tags= res.findAll("h3", {"class":"post-title"})

接下来我们用for循环来遍历它们。代码如下:

from urllib.request

import urlopen from urllib.error

import HTTPError from urllib.error

import URLError from bs4

import BeautifulSoup

try: html =urlopen("https://likegeeks.com/") except HTTPError as e:

print(e) except URLError: print("Serverdown or incorrect domain")

else: res =BeautifulSoup(html.read(),"html5lib")

tags = res.findAll("h3",{"class": "post-title"})

for tag in tags: print(tag.getText())

以上代码会把所有H3标签中叫做post-title类的内容。

我们使用getText函数来显示标签中的文字,如果不使用将得到包含所有内容的标签。

检查getText的差异

当我们使用getText()函数 ,结果如下:

不使用getText()函数的结果:

BeautifulSoup的全部例子

上面我们看到使用findAll函数过滤标签,下面还有一些方法。

要过滤抓取的HTML中,获取所有span、锚点以及图像标签。

tags= res.findAll("span", "a" "img")

以下代码用来提取所有具有readmorebtn和url类的标签。

tags= res.findAll("a", {"class": ["url","readmorebtn"]})

还可以使用抓取文本参数来取得文本本身。如下:

tags= res.findAll(text="Python Programming Basics withExamples")

findAll函数返回与指定属性相匹配的全部元素。如果只想返回1个元素,可以使用limit参数或使用仅返回第1个元素的find函数。

使用BeautifulSoup找到Nth的子结点

BeautifulSoup对象具有很多强大的功能,如直接获取子元素,如下:

这会获得BeautifulSoup对象上的第一个span元素,然后在此节点下取得所有超链接元素。如果我们想得到第11个节点呢,可以使用如下的选择功能。

tag =res.find("nav", {"id":"site-navigation"}).select("a")[3]

这一行代码将获取id为“site-navigation”的nav元素,然后我们从nav元素中获取第4个超链内容。

BeautifulSoap真是一个功能强大的库。

编译:前端老白

来源:dzone.com

本文来自企鹅号 - 21CTO媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的知识天地

前端字体截取技术,做炫酷网站再也不用怕中文字体数据量大啦!【实战】

众所周知,相对于英文字体,中文字体天生是“庞然大物”。英文字体两三百KB已经很大了,而中文字体几MB十几MB都算小的。一方面,中文字体包含的字形数量极多,动辄数...

54520
来自专栏更流畅、简洁的软件开发方式

【自然框架】n级下拉列表框的原理

  其实原理也很简单,分成两个部分,一个是服务器端,一个是客户端。   首先要设置记录集,这里用DataSet来装载,二级联动,里面就要有两个DataTable...

28670
来自专栏Android群英传

onTouchEvent(二) 使用Scroller实现黏性滑动的ScrollView

9230
来自专栏CRPER折腾记

Vue 折腾记 - (7) 写一个挺不靠谱的Vue-Echarts组件

上基友社区看了下,发现对echarts的封装都是打包进去的...想想就还是算了.. 图表这货.说实在的,若不是整个系统大量用到,打包进去没必要...

9420
来自专栏程序员的诗和远方

在React Native中优雅的使用iconfont

React Native大火大热,其中为了解决图标,易于修改,换颜色,高清等需求,iconfont的应用更是必不可少。 React Native中的ic...

61140
来自专栏iKcamp

追溯 React Hot Loader 的实现

文:萝卜(沪江金融前端开发工程师) 本文原创,转载请注明作者及出处 如果你使用 React ,你可以在各个工程里面看到 Dan Abramov 的身影。他于...

489140
来自专栏hightopo

原 基于 HTML5 WebGL 的 3D

33560
来自专栏前端知识分享

Vue入门---常用指令详解

Vue是一个MVVM(Model / View / ViewModel)的前端框架,相对于Angular来说简单、易学上手快,近两年也也别流行,发展速度较快,已...

12510
来自专栏前端知识分享

Web前端面试宝典(最新)

html语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析;即使在没有样式CSS情况下也以一种文档格式显示,并且是容易阅读的;

41730
来自专栏张善友的专栏

初探ReactJS.NET 开发

ReactJS通常也被称为"React",是一个刚刚在这场游戏中登场的新手。它由Facebook创建,并在2013年首次发布。Facebook认为React在处...

23850

扫码关注云+社区

领取腾讯云代金券