全网文章采集(壁纸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)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线