Python爬虫入门基础,怎么利用多协程的方式来爬取网站的内容

核心提示协程:在实现利用多进程方式爬取网站内容,首先得先知道什么是进程?到这里,先来说说什么是同步和异步?同步:比如我听完一首歌之后再听第二另首歌;异步:比较好懂的是,我们经常去网盘下载东西,一般下载文件都比较多,这些文件同时都在下载,哪一个文件先

协程:

在实现利用多进程方式爬取网站内容,首先得先知道什么是进程?

到这里,先来说说什么是同步和异步?

同步:比如我听完一首歌之后再听第二另首歌;

异步:比较好懂的是,我们经常去网盘下载东西,一般下载文件都比较多,这些文件同时都在下载,哪一个文件先下载好就先完成退出,而其他文件继续保持下载的状态。

那么,通过上面的例子介绍,显然是通过异步方式比同步方式的效率要高很多。

像爬虫的同步方式是向服务器发起请求并等待响应,服务器响应通知爬虫,爬虫响应,执行下一步的操作。

多协程原理:

这里引一下多协程原理:其实通过搜索引擎搜索就可以查看到详细的介绍。

用通俗易懂的话讲它就是一个任务在执行过程中,以下载文件为例:如果遇到等待下载的状态,就先去执行其他的任务,当等待结束之后,再回来继续下载之前的那个任务。一般这种任务来回切换是非常快速的,我们肉眼看上去就像多个任务在被同时执行一样,看不出区别来,但工作时间相比缩短很多,可以这么讲,多协程就是能够缩短工作时间的原理仅此而已。

gevent库:

好,接下来讲一个模块:叫monkey模块,在编写代码时候就从gevent库离导入monkey模块:

from gevent import monkey

同时还需要写入这串代码:

monkey.patch_all  #也叫猴子补丁

作用:就是能够把程序变成协作方式运行,就是可以帮助程序实现异步的方式进行。

同时这里需要用到两个函数,分别是gevent.spawn和gevent.jionall。

所以:gevent实现多协程爬取内容需要三步骤:1、自定义爬取函数;2、gevent.spawn创建任务;3、gevent.joinall执行任务。

queue队列:

这里面还需要提到一个queue模块:

queue模块也叫作队列模块,作用是可以用queue模块来存储任务,让任务都变成一条整齐的队列。因为queue其实是一种有序的数据结构,可以用来存取数据。这样,协程就可以从队列里把任务提取出来执行,直到队列空为止,任务也就处理完毕。

queue队列有以下几种方法,分别是:

put_nowait:往队列里存储数据;

get_nowait:从队列里提取数据;

empty:判断队列是否为空

full:判断队列是否为满;

qsize:判断队列还剩多少数量。

当然,queue模块也需要三步骤来建立,首先Queue创建队列;其次用put_nowait存储数据;最后用get_nowait提取数据。

CSV文件存储写入和读写:

import csv # 导入csv模块 # 写文件file = openwriter = csv.writerwriter.writerow# 读文件file = openreader = csv.readerfor row in reader: printfile.close

准备的模块也准备得差不多了,下面就是程序的代码实现思路:

首先爬取内容,肯定是要有网站网址,爬取什么内容,以及HTML基础,以及上面所讲的模块整合运用,就可以实现了。

声明:

没经过别人网站的同意,这里不以真实站点来实现。仅以虚拟站点作为例子:如果

想要验证下,可以自己通过自己的博客等授权网站进行测试:

实现代码的过程都是从打开网址开始,然后打开Network刷新一下,查看第0个请求,看Response。如果我们能在Response里找到想要获取的信息,说明我们想要的数据存在HTML里。网站信息是HTML则可以直接退出,不是则查看XHR,继续翻看XHR,阅读下XHR的name或操作加载新的XHR。

这里是爬取某一个网站内容的代码,如下所示:

# 下面是所有导入所需的库和模块from gevent import monkeymonkey.patch_allimport requests, gevent, time, csvfrom bs4 import BeautifulSoupfrom gevent.queue import Queuestart = time.timework = Queue  # 创建队列# 写入csv表格存储数据file = openwriter = csv.writerwriter.writerowUrl_1 = " for i in range:    for j in range: Url = Url_1.format work.put_nowait  # 存储数据 # 以上通过两个for循环,能设置分类的数字和页数的数字。然后,把构造好的网址用put_nowait添加进队列里Url_2 = "file/tupian/20220806/xxx page={num}"for i in range:    Url = Url_2.format    work.put_nowait  # 存储数据    # 自定义爬取函数    def crawler:    headers = {"User-Agent": "Mozilla/5.0  AppleWebKit/537.36  Chrome/69.0.3947.100 Safari/537.36"}    # 添加请求头,防止反爬虫    while not work.empty:      # 当队列不是空的时候,就执行下面的程序 url = work.get_nowait  # 提取数据 res = requests.get  # 获取数据 res.encoding = "utf-8" # 编码格式 soup = BeautifulSoup  # 解析数据 items = soup.find_all  # 解析后提取数据 for item in items:  # 遍历     link = "file/tupian/20220806/www.xxxxxx.com" + item.find["href"] # 提取内容链接     name = item.find.text.strip # 提取内容名称     # name = item.find_all[1]["title"] 利用这个提取方法也可以     thumbs = item.find.text # 提取内容点赞数     writer.writerow  # 将数据写入csv文件中     print  # 打印数据     task_list = []  # 创建空的任务列表     for i in range:  # 创建5个爬虫,写100就等于创建了100个爬虫    task = gevent.spawn  # 用gevent.spawn函数创建执行crawler函数的任务    task_list.append  # 往任务列表添加任务    gevent.joinall  # 用gevent.joinall方法,启动协程,执行任务列表里的所有任务,就可以让爬虫开始爬取网站内容了    end = time.timeprint # 打印所提取内容花费的时间    file.close  # 最后关闭文件

补充:

如果在运行启动后,出现以下密密麻麻的报错,请不要慌:

也许是你gevent模块没安装,或者之前安装过了,版本太老了,需要升级最新版本。可以通过在命令终端输入:pip3.exe list 查看各模块对应版本信息,再通过输入:pip3.exe install --upgrade gevent==20.9.0进行安装升级,如下图所示:

这时候显示安装成功的提示,就可以正常使用了。当然,以上仅仅是一个入门级别的爬虫例子,可以先学习一些常用的技术,比如正则表达式,数据库,优秀的框架等。试着去使用Scrapy模拟登录、存储数据库、使用HTTP代理、分布式爬虫等方法,针对性去学习和使用!

 
友情链接
鄂ICP备19019357号-22