【爬虫】3.5 实践项目——爬取网站的图像文件

news/2025/1/10 21:25:31/

1. 项目简介                

        指定一个网站(例如中国天气网站),可以爬取这个网站中的所有图像文件,同时把这些文件保存到程序所在文件夹的images子文件夹中。 首先设计了一个单线程的爬取程序,这个程序会因网站的某个图像下载过程缓慢而效率低下,为了提高爬取的效率,另外设计了一个多线程的爬取程序。在多线程程序中,如果一个图像下载缓慢,那么也就是爬取它的那个线程缓慢,不影响别的线程的爬取过程

2. 单线程爬取图像的程序

singleThread.py如下:
# 单线程爬取图像的程序
from bs4 import BeautifulSoup
from bs4.dammit import UnicodeDammit  # BS内置库,用于推测文档编码
import urllib.request  # 发起请求,获取响应
import urllib.parse
import osdef imageSpider(start_url):try:urls = []req = urllib.request.Request(start_url, headers=headers)data = urllib.request.urlopen(req)data = data.read()dammit = UnicodeDammit(data, ["utf-8", "gbk"])data = dammit.unicode_markup  # 解码soup = BeautifulSoup(data, "lxml")images = soup.select("img")for image in images:try:src = image["src"]url = urllib.parse.urljoin(start_url, src)  # 拼接成一个URL。if url not in urls:urls.append(url)print(url)download(url)except Exception as err:print(err)except Exception as err:print(err)def download(url):global counttry:count = count + 1if url[len(url) - 4] == ".":  # 提取文件后缀扩展名ext = url[len(url) - 4:]else:ext = ""req = urllib.request.Request(url, headers=headers)data = urllib.request.urlopen(req, timeout=100)data = data.read()if not os.path.exists("images"):  # 如果images目录不存在os.mkdir("images")  # 创建该目录                      fobj = open("images\\" + str(count) + ext, "wb")fobj.write(data)fobj.close()print("downloaded " + str(count) + ext)except Exception as err:print(err)start_url = "http://www.weather.com.cn/weather/101280601.shtml"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/114.0.0.0 Safari/537.36"}count = 0
imageSpider(start_url)

        在这个单线程的爬取程序中是逐个取下载图像文件的,如果一个文件 没有完成下载,后面一个下载任务就必须等待。如果一个文件没有完成下载或者下载出现问题,就直接会影响下一个文件的下载,因此效率低,可靠性低

3. 多线程爬取图像的程序

multiThread.py如下:
# 多线程爬取图像的程序
from bs4 import BeautifulSoup
from bs4.dammit import UnicodeDammit
import urllib.request
import urllib.parse
import threading
import osdef imageSpider(start_url):global threadsglobal counttry:urls = []req = urllib.request.Request(start_url, headers=headers)data = urllib.request.urlopen(req)data = data.read()dammit = UnicodeDammit(data, ["utf-8", "gbk"])data = dammit.unicode_markupsoup = BeautifulSoup(data, "lxml")images = soup.select("img")for image in images:try:src = image["src"]url = urllib.parse.urljoin(start_url, src)if url not in urls:urls.append(url)print(url)count = count + 1T = threading.Thread(target=download, args=(url, count))T.setDaemon(False)T.start()threads.append(T)except Exception as err:print(err)except Exception as err:print(err)def download(url, count):try:if url[len(url) - 4] == ".":  # 提取文件后缀扩展名ext = url[len(url) - 4:]  # .jpg  or .pngelse:ext = ""req = urllib.request.Request(url, headers=headers)data = urllib.request.urlopen(req, timeout=100)data = data.read()if not os.path.exists("images"):  # 如果images目录不存在os.mkdir("images")  # 创建该目录fobj = open("images\\" + str(count) + ext, "wb")fobj.write(data)fobj.close()print("downloaded " + str(count) + ext)except Exception as err:print(err)start_url = "http://www.weather.com.cn/weather/101280601.shtml"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/114.0.0.0 Safari/537.36"}count = 0
threads = []
imageSpider(start_url)
for t in threads:t.join()
print("The End")

        在这个多线程的爬取程序中,下载一个图像文件的过程是一个线程,因此,可以有多个文件在同时下载,而且互不干扰,如果一个文件没有完成下载或者下载出现问题,也不会影响别的文件的下载,因此效率高,可靠性高


http://www.ppmy.cn/news/217247.html

相关文章

广州食堂供应商排行榜,食堂供应商十佳参考名单

广州食堂供应商有:康来福、乐禾LEHE、华隆果菜、佳鲜农庄、粤旺YueWang、嘉宝、东升农场、从玉CY、望家欢、厨之喜等。排名不分先后,数据来源网络! 康来福:2007年成立,总部位于广州,是一家全国性、集团型的…

cpu排行计算机专业,cpu性能天梯图,教您电脑cpu排行榜

作为整个电脑的核心部件,CPU的选择必须是慎重的,如果你对这个了解不是很深,就会很艰难,那么,对于近期打算装机的朋友来说,CPU怎么看好坏,如何判断某款处理器性能如何呢?其实答案很简…

2020年主流服务器主板,2020年主流处理器排行榜

TPO1:高通骁龙865 2020年上半年最强安卓处理器。 值得入手代表机型:小米10系列、真我X50Pro系列、iQOO Neo3、魅族17系列、OPPO Ace系列。 TOP2:麒麟990 5G 麒麟现阶段最强处理器,相比于骁龙865有一定差距,但是在5G通信…

服务器主板性能排行榜,四路绝佳!华硕服务器主板性能强劲

优化通风散热 更稳更强的四路平台 随着64位计算以及多核技术的成熟与普及,在新技术的带动下,多核四路服务器在处理能力、扩展性、稳定性、可靠性、易管理性等方面表现更出色,能更有效地保护用户的投资。以海量数据处理、大规模网络应用、复杂科学计算及大型图形建模为特征的…

STM32通过esp8266连接WiFi接入MQTT服务器

上文我们讲到如何搭建本地MQTT服务器,现在介绍如何通过stm32连接MQTT 一.首先我们初始化esp8266这里我们使用的是USART4与其通信代码如下 void UART4_Init(uint32_t bound) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB1…

主板排行榜 一线二线三线等

主板排行榜-一线二线三线等 一线品牌:主要特点就是研发能力强,推出新品速度快,产品线齐全,高端产品非常过硬,目前认可度比较高的是以下三个品牌: 华硕(ASUS):全球第一大…

7450清零_联想M7450F打印机加粉清零方法

展开全部 联想M7400一体打印2113机加粉5261清零的步骤如下4102: 1、加粉后将硒鼓放入1653机器版内,权通电,打开前盖(放入硒鼓时打开的前面板) 2、加粉后将硒鼓放入机器内,通电,打开前盖(放入硒鼓时打开的前面板)&#…

IT成长日记(二)——联想打印机

使用激光打印机的用户但给我们打印机中的墨粉用完之后需要通过重新加粉,我们还需要对硒鼓进行清零操作,一定要进行清零才可以打印机,给大家分享下一些常见的联想打印机硒鼓清零的方法。 解决方案: 请您根据您设备的型号核实相应的硒鼓清零方…