今天用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)