全网文章采集(壁纸360全网超高清壁纸2.采集思路:网页导航栏)
优采云 发布时间: 2022-03-28 09:20全网文章采集(壁纸360全网超高清壁纸2.采集思路:网页导航栏)
1. 采集网站:
壁纸360
采集内容:
壁纸360全网超高清壁纸
2.采集事情:
网页导航栏共有16个类别。第一类收录以下所有类别。为了按类型存储图片,只有最后 15 个标签是 采集。
然后先是分类标签下的采集及其名称(最基础的采集,不用多说,直接一步到位)
下一步是找到图片链接以查看列表页面上的每张图片
从上面的链接我们可以看到图片被缩放到了208x130像素,那么如何截取原创像素图片呢?
点击图片进入图片详情页面。这时候发现图片的像素高一点,可以达到800x580。
还是达不到想要的像素?
仔细观察这个页面的按钮,有点击下载壁纸大图,如下图
点击后查看网络请求,可以看到已经请求了最高清的图片。
最后根据需要采集不同分辨率的图片界面
最小像素采集列表页面链接,格式:
普通像素采集详情页链接,格式:
高清像素采集点击下载壁纸获取链接,格式:
观察了很多次,发现路由是有规律的,跟着处理就行了,已经以高清示例为例。
在列表页面中,我们可以抓取 /allimg/litimg/6730_1.jpg
高分辨率图片的链接是:
+ 链接中的整数(6730 的最后两位) + 链接中的整数部分(6730) + ".jpg"
realImgUrl = sourceUrl2 + url1[0][-2:] + "/" +url1[0] + ".jpg"
最后一句话可能是翻页问题。观察倒数第二页和最后一页的网页结构。
所以采集页面和终止条件如下:
3.整体代码:
采集最高清的图,我采集用了代理,不知道没有代理会不会封IP采集,建议带IP代理。以下是去掉代理粗体后的整体代码:
# -*- coding: UTF-8 -*-
'''
@Author :Jason
@Desc :http://www.bizhi360.com/
360壁纸采集
网站壁纸一共15个类
'''
import requests
from lxml import etree
import os
import re
import time
def getImageTypeAndName():
'''
主要抓取壁纸分类链接 和 壁纸分类名称
:返回壁纸分类连接 壁纸分类名称
'''
url = "http://www.bizhi360.com"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",
}
res = requests.get(url=url,headers = headers)
res.encoding = "gbk"
etreeHtml = etree.HTML(res.text)
imageType = etreeHtml.xpath('//div[@id="tagnav"]//div[@class="container"]/a/@href')
imageTypeName = etreeHtml.xpath('//div[@id="tagnav"]//div[@class="container"]/a/text()')
return imageType[1:],imageTypeName[1:] #去掉/desk/ 和 壁纸图片大全 这一分类,包含所有图片
def downloadImage():
'''
直接采集图片,根据图片分类保存到指定文件夹
:return:None
'''
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",
}
sourceUrl1 = "http://www.bizhi360.com"
sourceUrl2 = "http://pic.bizhi360.com/bbpic/"
imageType, imageTypeName = getImageTypeAndName()
for i,url in enumerate(imageType):
if os.path.exists(imageTypeName[i]): #文件夹存在,不操作
pass
else:#文件夹不存在,创建文件夹
os.mkdir(imageTypeName[i])
print("创建文件夹")
for page in range(1,1000): #先假设每个分类有1000页,后期增加判断条件可提前结束
listUrl = sourceUrl1 + url + "list_" + str(page) + ".html"
print(listUrl)
res = requests.get(listUrl, headers = headers)
res.encoding = "gbk"
etreeHtml = etree.HTML(res.text)
imageUrlList = etreeHtml.xpath('//*[@id="main"]/div/div[1]/ul/li/a/img/@src')
for imageUrl in imageUrlList:
url1 = re.findall(r'/(\d+).*?\.jpg',imageUrl)
realImgUrl = sourceUrl2 + url1[0][-2:] + "/" +url1[0] + ".jpg"
print(realImgUrl)
resImg = requests.get(url=realImgUrl,headers=headers)
with open("./"+imageTypeName[i] +"/"+ url1[0] + ".jpg","wb") as f:
f.write(resImg.content)
print("壁纸", url1[0] + ".jpg","保存完毕")
if "下一页" in res.text:#判断抓取终止条件,存在那么就停止抓取
break
if __name__ == "__main__":
# getImageTypeAndName()
downloadImage()
print(" ")
4.决赛采集效果:
5.说明:
线程进程没有使用是因为代理的问题,二是他不着急。写完代码,他直接把服务器扔了,让他自己去抢。如果需要,可以改进代码,加快爬取速度。我没有对异常做任何事情(#confidence qaq)