工信部 加强网站备案,网站建设 长安,网站建设制作怎么弄,怎么设计一个软件python抓取优美图库小姐姐图片
整体功能概述
这段 Python 代码定义了一个名为 ImageDownloader 的类#xff0c;其主要目的是从指定网站#xff08;https://www.umei.cc#xff09;上按照不同的图片分类#xff0c;爬取图片并保存到本地相应的文件夹中。不过需要注意其主要目的是从指定网站https://www.umei.cc上按照不同的图片分类爬取图片并保存到本地相应的文件夹中。不过需要注意未经授权爬取网站数据可能存在合法性问题代码仅用于学习代码逻辑和合理的测试场景等情况。
代码思路详细拆解 类的初始化__init__ 方法 定义了 base_url 变量用于存储目标网站的基础地址即 https://www.umei.cc。创建了一个空字典 category_urls后续将用于存放不同图片分类对应的具体页面链接。设置了请求头 headers模拟浏览器发起请求使服务器更有可能正常响应请求避免因反爬机制而拒绝访问。 创建分类文件夹create_category_directories 方法 遍历 category_urls 字典中的每个分类名称键。针对每个分类名称尝试创建对应的文件夹若文件夹已存在则打印提示信息跳过创建若创建过程中出现其他 OSError 类型的错误则打印相应的错误提示。 发送 HTTP GET 请求send_get_request 方法 接收一个 url 参数使用 requests 库发送 GET 请求并传入设定好的请求头。若请求过程中出现 requests.RequestException 异常比如网络连接问题、服务器拒绝访问等则打印异常相关信息并返回 None表示请求失败若请求成功则设置响应内容的编码为 utf-8然后返回响应对象。 下载图片download_image 方法 接收图片名称 image_name 和图片的 URL image_url 作为参数。首先从图片 URL 中提取文件后缀名例如 .jpg、.png 等然后通过调用 send_get_request 方法获取图片的二进制内容。使用 with 语句以二进制写入模式打开一个本地文件文件名由图片名称和后缀名组成并将获取到的图片二进制内容写入该文件以此实现图片的下载保存。 主流程main 方法 第一步先向网站的图片分类主页面base_url /weimeitupian/发送 GET 请求若请求成功使用 BeautifulSoup 库解析返回的 HTML 页面内容。第二步通过 CSS 选择器从解析后的页面中查找不同的图片分类元素提取分类名称和对应的链接并将它们存入 category_urls 字典中。第三步调用 create_category_directories 方法依据 category_urls 字典中的分类名称创建对应的本地文件夹。第四步遍历 category_urls 字典针对每个分类再次向其对应的页面发送 GET 请求若请求成功同样使用 BeautifulSoup 解析页面获取该分类下每张图片相关的元素信息。第五步对于每张图片提取图片名称以及图片详情页的链接接着向图片详情页发送 GET 请求若该请求也成功继续解析详情页找到真正的图片 URL最后调用 download_image 方法将图片下载保存到对应的分类文件夹下同时在控制台打印保存成功的图片名称信息在各个环节如果出现请求失败或者找不到相应元素等情况会打印对应的提示信息说明图片保存失败以及失败的原因。 实例化类并执行主流程 在代码的最后实例化了 ImageDownloader 类并调用其 main 方法启动整个图片爬取和保存的流程。
# encodingutf-8
import requests
from bs4 import BeautifulSoup
import osclass ImageDownloader:def __init__(self):self.base_url https://www.umei.ccself.category_urls {}self.headers {User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE}def create_category_directories(self):创建以图片分类名称为名称的文件夹for category_name in self.category_urls:try:os.mkdir(f./{category_name})except FileExistsError:print(f文件夹 {category_name} 已存在跳过创建)except OSError as e:print(f创建文件夹 {category_name} 时出现错误: {e})def send_get_request(self, url):发送HTTP GET请求并返回响应对象设置正确的编码try:response requests.get(url, headersself.headers)response.encoding utf-8return responseexcept requests.RequestException as e:print(f请求 {url} 出现异常: {e})return Nonedef download_image(self, image_name, image_url):根据给定的名称和图片URL下载图片并保存到本地对应的文件夹中file_extension image_url.split(.)[-1] # 获取后缀名image_content self.send_get_request(image_url).contentwith open(f./{image_name}.{file_extension}, wb) as file:file.write(image_content)def main(self):main_page_response self.send_get_request(self.base_url /weimeitupian/)if main_page_response:main_page_soup BeautifulSoup(main_page_response.text, html.parser)category_elements main_page_soup.select(body div.Clbc_top div.taotu-nav)for category_element in category_elements:category_name category_element.find(a).get_text()category_href category_element.find(a).get(href)self.category_urls[category_name] category_hrefself.create_category_directories() # 创建文件夹# 进行保存数据for category_name, category_href in self.category_urls.items():category_page_response self.send_get_request(self.base_url category_href)if category_page_response:category_page_soup BeautifulSoup(category_page_response.text, html.parser)image_elements category_page_soup.select(#infinite_scroll div)for image_element in image_elements:image_link_element image_element.select_one(div.item_b.clearfix div.title span a)if image_link_element:image_name image_link_element.get_text() # 图片名字image_href https://www.umei.cc image_link_element.get(href) # 子页面地址sub_page_response self.send_get_request(image_href)if sub_page_response:sub_page_soup BeautifulSoup(sub_page_response.text, html.parser)img_url_element sub_page_soup.select_one(body div:nth-child(3) div.photo div.big-pic a img)if img_url_element:img_url img_url_element.get(src)self.download_image(category_name / image_name, img_url)print(category_name / image_name) # 保存else:print(f无法获取 {category_name / image_name} 的图片URL保存失败)else:print(f请求子页面 {image_href} 失败{category_name / image_name} 保存失败)else:print(f无法获取 {category_name} 分类下某张图片的元素信息跳过保存)else:print(f请求 {self.base_url category_href} 失败跳过该分类下图片保存)downloader ImageDownloader()
downloader.main()