利用多线程爬取表情包

今天用python爬了一下表情包

首先,我们先导入一些所需的包

#系统包
import os

#时间包
from time import time

# 爬虫包
import lxml as lxml
import requests

# 网页选择器
from bs4 import BeautifulSoup

# 队列,保证信息在多线程中安全交换,先进先出
from queue import Queue

# 多线程包
from threading import Thread

导入包之后我们就要开始写爬虫程序了

def download_emoticons(url, path):
	response = requests.get(url)
	soup = BeautifulSoup(response.content, 'lxml')

这是下载表情包定义的方法,其中的url为要爬取的网站地址,path为我们抓取的表情包保存到本地的地址,其中要用到requests.get()这个方法,lxml也是需要下载的
接下来我们分析要爬取的网站
在这里插入图片描述
然后检查网页
在这里插入图片描述
这是表情包的原地址,打开这个地址我们就可以看到该图片
在这里插入图片描述
在这里插入图片描述
分析网页可知img是表情包的标签

    # 分析页面
    img_list = soup.find_all('img', class_='ui image lazy')
    print(img_list)

结果如图所示
抓取到表情包的链接
观察我们所获取的链接可知,我们只需要其中的一小部分,只需根据参数就可以获得表情包地址

for img in img_list:
	image = img.get('data-original')
	alt = img.get('alt')

运行程序我们可得以下结果
在这里插入图片描述
接下来,我们就需要把爬取的图片下载到本地文件

try:
	with open(path + alt + os.path.splitext(image)[-1], 'wb') as f:
		img = request.get(image).content
		f.write(img)
except OSError:
	print('图片下载失败...')

这是下载结果,不过下载很慢
在这里插入图片描述
完整代码如下:

# 系统包
import os

# 时间包
from time import time

# 爬虫包
import lxml as lxml
import requests

# 网页选择器
from bs4 import BeautifulSoup

# 队列,保证信息在多线程中安全交换,先进先出
from queue import Queue

# 多线程包
from threading import Thread

# 爬虫程序
def download_emoticons(url, path):
    response = requests.get(url)
    # 筛选数据
    soup = BeautifulSoup(response.content, 'lxml')
    # 分析页面
    img_list = soup.find_all('img', class_='ui image lazy')
    # print(img_list)
    for img in img_list:
        image = img.get('data-original')
        alt = img.get('alt')
        print('下载图片' + alt)
    try:
        with open(path + alt + os.path.splitext(image)[-1], 'wb') as f:
            img = requests.get(image).content
            f.write(img)
    except OSError:
        print('图片下载失败....')


url = 'https://www.fabiaoqing.com/bqb/lists/page/2.html'
path = r'C:\Users\小黑\PycharmProjects\多线程爬取表情包\Emoticon\表情包\biaoqingbiao1'
download_emoticons(url, path)

然后我们用多线程方式来看

# 多线程类
class DownloadEmoticon(Thread):
    # 重写构造函数
    def __init__(self, queue, path):
        Thread.__init__(self)
        self.queue = queue
        self.path = path

        # 判断当前路径是否有文件,没有就创建
        if not os.path.exists(path):
            os.makedirs(path)
    # 重写多线程的run方法
    def run(self):
        while True:
            url =self.queue.get()
            try:
                download_emoticons(url, self.path)
            finally:
                # 后续调用队列,任务处理是完整的
                self.queue.task_done()

完整多线程代码如下

# 系统包
import os

# 时间包
from time import time

# 爬虫包
import lxml as lxml
import requests

# 网页选择器
from bs4 import BeautifulSoup

# 队列,保证信息在多线程中安全交换,先进先出
from queue import Queue

# 多线程包
from threading import Thread
# pip install lxml

# 多线程类
class DownloadEmoticon(Thread):
    # 重写构造函数
    def __init__(self, queue, path):
        Thread.__init__(self)
        self.queue = queue
        self.path = path

        # 判断当前路径是否有文件,没有就创建
        if not os.path.exists(path):
            os.makedirs(path)
    # 重写多线程的run方法
    def run(self):
        while True:
            url =self.queue.get()
            try:
                download_emoticons(url, self.path)
            finally:
                # 后续调用队列,任务处理是完整的
                self.queue.task_done()



url = "https://fabiaoqing.com/bqb/lists/page/20.html"
# 爬虫程序
def download_emoticons(url, path):
    response = requests.get(url)
    # 数据筛选
    soup = BeautifulSoup(response.content, 'lxml')
    # 分析页面
    img_list = soup.find_all('img', class_="ui image lazy")
    # print(img_list)
    for img in img_list:
        image = img.get('data-original')
        alt = img.get('alt')
        print('下载图片', alt)

        try:
            # os.path.splitext将文件名和拓展名分开
            with open(path + alt + os.path.splitext(image)[-1], 'wb') as f:
                img = requests.get(image).content
                f.write(img)
        except OSError:
            print('图片下载失败....')
            break


path = r'C:\Users\小黑\PycharmProjects\多线程爬取表情包\Emoticon\表情包'
download_emoticons(url, path)

if __name__ == '__main__':
    start = time()
    # 构造所有连接
    _url = 'https://fabiaoqing.com/bqb/lists/page/{page}.html'
    urls = [_url.format(page=page) for page in range(1, 21)]
    queue = Queue()
    path = './表情包'
    # 创建线程
    for x in range(10):
        worker = DownloadEmoticon(queue, path)
        # 设置守护线程,当主线程退出,守护线程退出
        worker.daemon = True
        worker.start()

    # 将图片原地址加入到队列当中
    for url in urls:
        queue.put(url)
    # 等队列为空时,再执行别的操作
    queue.join()

    print('下载完毕,耗时:', time() - start)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值