一、回忆录:
我们前面学习了爬取站点前应该做的几件重要的事情涉及到的相关技术,链接如下,感兴趣的小伙伴可以看一下,看了有惊喜哦:
Python 爬虫实战系列(一)如何做一只绅士、文明的爬虫
python 爬虫系列(二)想要爬取站点?这几件事情很重要
python动手写爬虫系列(三)还说自己不会爬虫?看看小白写的先
二、抓取住房信息
本次我们的目标是没有蛀牙。。。。啊,什么?
哈哈,本次我们的目标是自己动手写一个爬虫,爬什么呢?抓取安居客上面的租房信息。
是的,没有错,我们的目标就是这么小。
哈哈,或许上面的是我们的人生目标,有没有。
OK,我就不瞎逼逼了,我们开始吧。
俗话说,万事开头难,特别咱的目标是让小白也懂写爬虫。
所以我们第一步我们就先抓取头部的导航栏如何?
OK,说干就干,我们重构前一章编写完成的download函数,使其结构更为清晰。
本次重构,我们主要是将方法抽取为类(说明我们的编程水平在进步哦),还将请求重试次数,请求代理等字段抽出来作为对象的属性,后续我们的属性会更多。
设置代理很重要哦,因为安居客对爬虫做了限制,不设置代理就获取不了数据的哦。
这次我们还要新增一个类:spider类
spider类主要用来控制爬虫,在spider中获取了要请求的url后,我们就会调用我们的重构的download类进行下载。
刚开始我们的类是不是很简单呢?那是必须的。
类的内部目前主要实例化一个download对象来下载url,一个crawl_queue存储等待下载的url,代码如下:
Ok,我们的Spider就写好来,此时我们运行时会发现。真的下载了哦,小编没有骗你哦。
不过下载后返回的html小编表示看的好郁闷。
不要着急,此时我们该使用神器了。
此时在家可以借助Chrome的调试工具来分析数据的标签,然后通过正则表达式来获取,不过实际开发过程中,这种做法肯定是行不通的。
接下来我们将为大家介绍两个神器:Beautiful Soup和Lxml
爬虫必备神器:Beautiful Soup和Lxml
Beautiful Soup
Beautiful Soup是一个可以从 HTML 或 XML 文件中提取数据的Python库,该模块可以帮助我们解析网页, 并提供定位内容的便捷接口。
Beautiful Soup使用知识补充:
Beautiful Soup能将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,而所有对象我们可以可以归纳为以下4种:
1、Tag
HTML 中的一个个标签,例如:<title></title>
使用也是非常简单的,如我想获取html中的title标签的内容:
soup = BeautifulSoup(html) #加载html,返回一个BeautifulSoup对象
soup.title : 如此便是取里面的title标签的内容了
对于Tag来说,其有两个属性:
name : 其为标签的名字,如<a></a>的name就是a
attrs:标签上的属性集合,返回的是一个字典,如a标签有class属性,id等。如果想获取属性的值可以:soup.a[‘class’]即可
注意事项:虽然这样子很好用,但是他取的都是第一个标签哦,也就是说假设你有很多 a 标签,他也会支取第一个,这样子局限性肯定很大是不。
2、NavigableString:
这个属性很有意思:我们前面已经获取了tag是不?我们想获取tag里的值该怎么办呢?此时我们可以使用:soup.a.string, 这样便获取了里面的值,而执行这句返回的就是一个NavigableString类型的对象了。
3、BeautifulSoup :
BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性
4、Comment:
Comment 对象是一个特殊类型的 NavigableString 对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。
也就是他能打印标签里的注释内容。
Beautiful Soup安装:
python3如下:pip3 install beautifulsup4
python2如下:pip install beautifulsup4
Ok,安装好之后,我们来试一下。
代码修改如下:
我们看下运行结果,
Ok,我们拿到了顶部导航的数据。而且BeautifulSoup返回给我们的是一个BeautifulSoup对象,其提供了非常丰富的api供我们查找相关的tag和内容。
如查找所有的a标签内的href的内容:
for link in soup.find_all(‘a’):
print(link.get(‘href’))
虽然Beautiful Soup已经很强大了,但是我想说,我更喜欢lxml,因为它支持xpath语法。
Lxml
Lxml 是基于 libxml2 这一XML解析库的Python封装。 该模块使用C语言编写,解析速度比Beautiful Soup更快,最新版本的lxml支持CPython2.6至3.6的版本。
Lxml也是唯一支持解析XMl的库哦。
其实我安装时感觉挺简单的,虽然网上说安装比较复杂。
我一不小心执行了:pip3 install lxml 就搞定了
Lxml常用方法及属性详解:
1、fromstring(html, base_url=None, parser=None, **kwargs) :将字符型html文档转换为节点树或文档树
2、 tostring(doc, prettyprint=False, includemetacontenttype=False, encoding=None, method=“html”, with_tail=True, doctype=None) : 将节点树或文档树序列化为字符型
3、base_url : 文档url
4、head : 标签部分
5、body : 标签部分
6、forms : 返回全部form列表
7、label : 元素的label标签
8、classes : class属性值的集合
9、drop_tag(self) : 移除标签,但不移除其子标签和text文本,将其合并到父节点
10、drop_tree(self) : 移除节点树(包含子节点和text),但不移除它的tail文本,将其合并到父节点或前一个兄弟节点
11、findclass(self, classname) : 根据class属性值查找节点元素
12、getelementby_id(self, rel) : 根据id属性值查找节点元素
13、set(self, key, value=None) :设置节点元素的属性
14、text_content(self) : 返回其后代节点与其自身的全部text内容
我们再稍微修改下代码:
Ok,我们来看下结果如何呢,是不是真的遍历出了我们要的信息呢?
本次我们完成了第一步,了解了如何请求网页,然后抓取信息。
我们下一篇的目标是抓取出租信息列表数据,并且实现自动请求分页的信息。
欢迎关注安杰小生,专注分享IT干货。
我的目标是:
我们下期的目标是,是抓取出租信息列表数据,并且实现自动请求分页的信息。