【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

时间:2023-03-09 07:14:36
【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

广东职业技术学院  欧浩源

1、引言

 网络爬虫可以完成传统搜索引擎不能做的事情,利用爬虫程序在网络上取得数据,经过数据清洗和分析,使非结构化的数据转换成结构化的数据,其结果可以存储到数据库,也可以进行数据的可视化,还能根据分析数据的基础获得想要的结果。除了利用urllib.request正则表达式或者利用Scrapy框架实现网络爬虫之外,利用RequestsBeautifulSoup4技术也可能很方便的实现网络爬虫。前者很多技术书籍和网络博文都有细述,后者目前的资料并不太多。
    本文将以一个具体例子,详细介绍利用RequestsBeautifulSoup4技术开发网络爬虫的技术要点实现步骤

2、爬虫的功能需求

爬虫的目标
    将“内涵吧”里面的内涵段子从第1页开始,逐页将段子爬出来,并将其文本存储到E盘的duanzi.txt文件下。
    爬虫的功能
    1、爬虫启动后,显示版本信息。
    2、每按一下回车键,爬去一页段子并保存。
    3、输入“exit”退出网络爬虫。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

网址http://www.neihan8.com/article/

3、爬虫程序的设计思路

首先使用Requests模块的get方法连接网页并获取网络资源,在这里需要爬取网页的URL。通过分析,发现“内涵吧”的网页URL中,处理第1页之外,其他每页都有规律可循。
    即:res = requests.get(myurl)
    接着利用BeautifulSoup模块使用lxml解析器将网络资源取出 放到变量中。
    即:soup = BeautifulSoup(res,'lxml')
    然后通过BeautifulSoup模块中的方法,过滤网络信息并将目标内容取出
    最后将目标内容存储到指定的文件中。

4、网络爬虫的基本功能

首先,用最简单的方法,实现将目标URL的内容爬取出来,如果这个步骤不能实现,后续的所有工作都是没有意义的。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

上面代码虽然只有区区几行,实际上,已经实现一个网络爬虫了。
    从获得的网络信息来看,很多地方出现乱码。这个问题是编码的问题。在获取的内容中,可以看到这样的信息:chaRset=utf-8
在读取网络信息之前,将其编码格式指定为utf-8即可。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

指定正确的编码方式后,获取的结果中没有乱码出现了。
    到这里,是不是就完美结束了呢?
    理论上可以,实际上还不行。现在很多网站对于非正常请求是拒绝访问的。所以,必须给爬虫穿上一个合法的外衣。最理想的做法是,将爬虫的访问模拟成浏览器的请求

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

至此,一个完美的网络爬虫基本结构就出来了。

5、将目标内容过滤出来

通过对爬取到的网页信息分析,在漫漫的信息海洋中,发现目标段子内容在div标签中,并且class属性desc

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

因此,可以通过BeautifulSoup模块faind_all()方法将其内容取出,其返回一个内容列表
    item_list = soup.find_all("div", {"class":"desc"})

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

在返回的内容列表中,还有一部分标签的信息,这是我们不需要的,可以只读取文本内容,把这些无关的信息过滤掉:
    print(item.text)

6、网络爬虫的基本框架

对网络爬虫的几个主要功能测试成功后,就可以开始构思的爬虫的基本框架了。
    首先定义一个网络爬虫类Spider,在该类中实现一个装载网页内容的方法load_and_deal_page(self,page),将指定页的内容读出装载到指定的变量中,并通过BeautifulSoup模块将所需内容过滤出来。
    再写一个将目标内容写入文件的方法write_to_file(self,text),将指定内容以追加的方式写入到固定的文件中。
    接着实现一个控制程序流程的方法begin_to_work(self),实现按下回车键爬取下一页和输入“exit”退出网络爬虫的功能。
    然后在类的__init__(self)方法中,实现基本信息的打印和相关变量的定义。
    最后在main函数中,实现一个网络爬虫的对象实例,并启动。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

7、网页装载及处理的方法

在网页装载的时候,需要获得该页面的URL地址。通过观察,除了“内涵吧”的首页地址之外,其他页面的URL均有规律可循。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

因此,可以使用if语句对其做适当的处理。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

该方法是本网络爬虫的核心代码,其实现可以如下:

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

8、将内容写入文件的方法

首先使用open方法以追加方式打开文件,接着用write方法就指定内容写入,最后用close方法关闭文件即可。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

9、初始化与流程控制的方法

在初始化函数中,除了打印基本信息之外,还要定义两个变量,enable用于控制爬虫是否启动,page用于控制爬取的页面。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

在流程控制的方法中,通过判断外部输入的信息,以实现网络爬虫的控制,如果收到回车键则爬取下一页网页信息,如果收到"exit"则退出网络爬虫。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

10、main函数的实现

当所有的功能模块实现时候,main方法是最简单的事情了。在这里,实现一个Spider的对象实例,并启动网络爬虫。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

11、网络爬虫的运行结果

网络爬虫启动后,在控制端口可以看到运行的信息并可以控制程序的继续和退出。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

打开指定写入的文件,可以看到从“内涵吧”爬去出来的段子内容。

【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

12、小结

 网络爬虫可以帮你收集和处理大量数据,让你可以一次查看几千甚至几万个网页,并通过数据分析获得目标结果。Python语言拥有强大的第三方库,从RequestsBeautifulSoup入手学习网络爬虫是一个非常不错的选择