设为首页 加入收藏

TOP

多线程爬取wallhaven(一)
2023-07-23 13:43:13 】 浏览:48
Tags:程爬取 wallhaven

前言

最近整理自己的项目时,发现之前自己写的爬取wallhaven网站顿时有来的兴趣决定再写一遍来回顾自己以前学的知识
网站地址:"https://wallhaven.cc/"

1. url参数结构

image

从url地址我们发现为"https://wallhaven.cc/search?categories=111&purity=110&sorting=date_added&order=desc&page=2",这段url里面代用几个参数分别为,categories,purit,sorting。而这几个参数分别对应界面的这几个按钮
image

2. 查看网页结构

按f12键查找到要爬取的图片目录
image
通过查看代码发现该图片只是一张预览图片,分辨率仅为300*200,明显不符合要求。
观察下方a标签
image
发现这个class为preview的标签中存在个href地址链接到该高清图片的正确地址,点击该地址跳转

image
通过查看代码发现这才是我们需要的图片,找到了我们要的图片链接,在img标签中。

image

通过以上观察我们可以知道,我们的代码编写思路

  1. 获取到这一页所有图片的url地址
  2. 通过解析获取到详情页网页的图片
  3. 请求到详情页网页图片进行下载

3. 开始爬取图片

3.1 初始化

import requests
url = "https://wallhaven.cc/search?categories=011&purity=010&sorting=date_added&order=desc&page=2"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56',
}

class Spider:
	# 初始化数据
	def __init__(self, url, header, cookie):
		self.user_url = url
		self.header = header
		self.img_list_url = [] # 存放一页的所有图片地址
		self.num = 0  # 计数爬取了多少张图片

3.2 获取到这一页所有图片的url地址

我们在Spider类中定义一个res方法来爬取这一页的所有url地址,并且利用列表推导式将所有的url地址存放到list_img列表中以便我们后续使用

# 获取某一页要下载的图片所有链接
def res(self):
	response = requests.get(self.user_url, headers=self.header).text
	soup = BeautifulSoup(response, "html.parser")
	img_href = soup.select(".thumb-listing-page > ul > li  a[href]")
	list_img = [i.get("href") for i in img_href]  # 所有的图片的href
	print(list_img)
	print("一共", len(list_img), "图片")
	return list_img

image

3.3 通过解析获取到详情页网页的图片

通过res方法我们得到了一页的所有图片链接,这时我们获取详情页的图片地址并把它存放到img_list_url列表中以便我们后续开启多进程进行下载。但是我们这些书写会出现拿不到详细页的图片地址从而导致下标越界从而报错,所以可以优化一下代码

# 获取详情页图片地址
def detail_page(self, list_img):
	# 遍历获取详情页图片地址
	for item in list_img:
		detail_page = requests.get(item, headers=self.header, cookies=self.cookie).text
		soup = BeautifulSoup(detail_page, "html.parser")
		img_url = soup.select("#showcase > div.scrollbox > img[src]")[0]["src"]
		self.img_list_url.append(img_url)
		print(img_url, "添加成功")
		self.error_img_url(item)
		return self.img_list_url

可以写出这样

# 获取详情页图片地址
def detail_page(self, list_img):
# 遍历获取详情页图片地址
for item in list_img:
	detail_page = requests.get(item, headers=self.header, cookies=self.cookie).text
	soup = BeautifulSoup(detail_page, "html.parser")
	try:  # 访问过快会爬取不到详情页图片地址,则出现一个空列表从而导致下标越界
		img_url = soup.select("#showcase > div.scrollbox > img[src]")[0]["src"]
		self.img_list_url.append(img_url)
		print(img_url, "添加成功")
	except IndexError:  # 出现下标越界调用error_img_url方法
		self.error_img_url(item)
		return self.img_list_url

# 处理获取失败的图片地址
def error_img_url(self, url):
	print(url, "没有获取到现在重新获取")
	# 休眠2秒重新发送请求
	time.sleep(2)
	detail_page = requests.get(url, headers=self.header, cookies=self.cookie).text
	soup = BeautifulSoup(detail_page, "html.parser")
	try:
		img_url = soup.select("#showcase > div.scrollbox > img[src]")[0]["src"]
		self.img_list_url.append(img_url)
		print(img_url, "获取成功")
	except IndexError:  # 如果还没有获取到图片地址那么递归调用
		
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇学习笔记——Django项目中关联查.. 下一篇Django笔记十七之group by 分组用..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目