明确爬取路线

我们要爬取的是ZOL桌面壁纸的壁纸下载排行榜系列壁纸

而要获取到每个下载排行榜系列的图片必须点击对应专题进入专题详情页才能看到专题对应的壁纸,这些壁纸就是我们要爬取的对象,归纳一下:

  1. 获取到整个首页html
  2. 定位到各个下载排行榜的系列专题,取出指定专题的标题和详情页链接
  3. 拼接完整链接以循环的方式再次发起对专题详情页的请求
  4. 得到详情页的html,取出每个壁纸的下载链接进行下载保存。
    具体实现步骤请继续往下看

实现技术

requests、lxml、re和os这四个python库,其中requests、lxml是第三方库,需要另行安装,使用pip install requests pip install lxml安装即可

实现与代码解析

  1. 通过检查浏览器源代码发现可以直接看到首页所有代码元素,由此说明ZOL桌面壁纸没有做反爬虫,所以直接发起请求获取首页html
# 主页url
index_url = 'http://desk.zol.com.cn'
# 主页请求头
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'
}
# 发起主页请求
response = requests.get(url=index_url + '/', headers=header)
  1. response是请求返回体,我们可以通过它得到首页htnml代码,现在我们要定位到下载排行榜代码位置,定位代码我们可以在网站按F12启动开发者模式
    如下图,开启后先点击1处,就能启动定位功能,然后把鼠标定位到2并点击,在3处就能到定位到的代码块了
  2. 定位完成后,我们需要得到它的xpath
    如图所示,点击要查询的代码块右键,选择Copy ->Copy full XPath即可得到
  3. 使用获取到的xpath得到各个专题链接再次发起请求
# 将请求回来的数据lxml化,方便使用xpath获取数据
response_lxml = etree.HTML(response.text)
# 通过xpath获取定位到所有壁纸类型下载排行版
side_response = response_lxml.xpath("//div[@class='side']/div[@class='model mt15']")# 通过循环操作每个壁纸类型下载排行版
for side_item in side_response:# 壁纸类型side_title = side_item.xpath("./div[@class='mod-header']/text()")[0]# 该类型下所有的壁纸专题li_response = side_item.xpath("./ul/li")# 通过循环操作每个壁纸专题for li_item in li_response:try:# 专题标题li_title = li_item.xpath("./a/text()")[0]# 专题独立页面urlli_url = li_item.xpath("./a/@href")[0]# 拼接合成专题urldesk_url = index_url + li_url# 发起专题页面内容请求desk_response = requests.get(url=desk_url, headers=header)# 将请求回来的数据lxml化,方便使用xpath获取数据desk_lxml = etree.HTML(desk_response.text)
  1. desk_lxml是详情页的html代码,通过desk_lxml我们可以定位和拼接出壁纸的下载链接(代码衔接在步骤4的代码后面
# 正则表达式匹配专题的图片展示数img_index_search = re.compile(r"/(\d+))")img_index_xpath = desk_lxml.xpath("//h3/span/text()")[1]img_index = re.search(img_index_search, img_index_xpath).group(1)# 正则表达式匹配专题url的独特数字
img_url_index_search = re.compile(r"_(.*?)_(.*?).html")
img_url = index_url + desk_lxml.xpath("//dd[@id='tagfbl']/a[@id='1366x768']/@href")[0]
img_url_index_1 = re.search(img_url_index_search, img_url).group(1)
img_url_index_2 = re.search(img_url_index_search, img_url).group(2)
  1. 这个时候我们要考虑好下载保存方式,因为是有多个下载排行榜的,所以存储时需要区分开来
# 为每个排行榜生成一个目录,判断目录是否存在  这个方法放到全局中
def is_exits(path):path = path.strip()path = path.rstrip('\\')is_exit = os.path.exists(path)if not is_exit:os.mkdir(path)print(path + '创建成功!')else:print(path + '已经存在!')
#(代码衔接在步骤5的代码后面)
# 调用is_exits判断目录是否存在,不存在则创建目录,存在则不做另外操作
is_exits(dir_name + "\\handle_desk.zol\\wallpaper\\" + li_title + "\\")
  1. 这个时候我们已经得到了所有壁纸的下载链接,因为每个专题的壁纸是多个的,我们页要通过循环来遍历下载(代码衔接在步骤5的代码后面
# 根据每个专题的图片数定义循环次数
for index in range(int(img_index)):# 根据获取到的内容拼接每个图片独立的页面urlimg_install_html_url = 'http://desk.zol.com.cn/showpic/1366x768_' + str(int(img_url_index_1) + index) + '_' + img_url_index_2 + '.html'# 防止拼接的图片页面urltry:# 请求每个图片的独立页面img_install_html_response = requests.get(url=img_install_html_url, headers=header)# 将请求回来的数据lxml化,方便使用xpath获取数据img_install_lxml = etree.HTML(img_install_html_response.text)# 获取到页面中提高的图片下载urlimg_install_url = img_install_lxml.xpath("//body/img[1]/@src")[0]# 请求图片下载urlimg_install_url_response = requests.get(url=img_install_url, headers=header)
  1. 最后对每个壁纸的链接发起请求,通过响应体得到图片数据,进行保存
# 根据每个专题的图片数定义循环次数
for index in range(int(img_index)):# 根据获取到的内容拼接每个图片独立的页面urlimg_install_html_url = 'http://desk.zol.com.cn/showpic/1366x768_' + str(int(img_url_index_1) + index) + '_' + img_url_index_2 + '.html'# 防止拼接的图片页面urltry:# 请求每个图片的独立页面img_install_html_response = requests.get(url=img_install_html_url, headers=header)# 将请求回来的数据lxml化,方便使用xpath获取数据img_install_lxml = etree.HTML(img_install_html_response.text)# 获取到页面中提高的图片下载urlimg_install_url = img_install_lxml.xpath("//body/img[1]/@src")[0]# 请求图片下载urlimg_install_url_response = requests.get(url=img_install_url, headers=header)# 实现图片下载操作,并进行归类with open(dir_name + '\\handle_desk.zol\\wallpaper\\' + li_title + '\\' + str(int(img_url_index_1) + index) + '.jpg', 'wb') as f:f.write(img_install_url_response.content)print("排行版专题:" + side_title + "\n")print("图片专题:" + li_title + "\n")print("图片url:" + img_install_url + "\n")print("下载成功~~~~~~~~")print("---------------------------------------------------------")except:print(side_title + "---->" + li_title + "中请求的图片页面url->" + img_install_html_url + "不存在")print("---------------------------------------------------------")print("---------------------------------------------------------")continuebreak
except Exception as e:
print(e)

优化方向

  1. 可以使用selenium模拟点击操作,这样就能直接进入详情页而不用进行二次请求
  2. 这个方案循环次数太多,可以用asyncio异步或者多线程提高爬取速度

总结

解析可能有点乱,请多包涵,可以直接看源代码 -> 源代码

使用requests+lxml爬取zol桌面壁纸相关推荐

  1. python桌面爬虫_爬虫项目实战十三:爬取zol桌面壁纸

    目标 爬取zol桌面壁纸,批量下载图片. 项目准备 软件:Pycharm 第三方库:requests,fake_useragent,re,lxml 网站地址:http://desk.zol.com.c ...

  2. python爬取ZOL桌面壁纸图片

    最近迷上了爬虫,看了一丢丢视频学习之后,开始实战,爬取图片地址: http://desk.zol.com.cn/ 循环爬取"风景"图片,实现代码如下: from urllib im ...

  3. 【python日常学习】爬取4K桌面壁纸

    [python日常学习]爬取4K桌面壁纸 这个网站都是4K的桌面壁纸. 不多说,直接上代码 import re import requests import osdef get_page():page ...

  4. python壁纸4k_【python日常学习】爬取4K桌面壁纸

    [Python] 纯文本查看 复制代码import re import requests import os from time import sleep def get_page(): page = ...

  5. python爬虫 requests+lxml爬取前程无忧网之模拟浏览器登录

    "前程无忧"(Nasdaq: JOBS) : 是国内一个集多种媒介资源优势的专业人力资源服务机构,创始人为甄荣辉.它集合了传统媒体.网络媒体及先进的信息技术,加上一支经验丰富的专业 ...

  6. Python网络爬虫小试刀——抓取ZOL桌面壁纸图片3

    前篇回顾:下载一个类型集合的全部图片 本篇目标:获得一个集合页面中所有集合中所有的图片 使用urllib2获取已知集合网页页面的HTML代码,首先使用正则表达式获取本页图片集合的url,根据上篇所写戏 ...

  7. Python网络爬虫小试刀——抓取ZOL桌面壁纸图片2

    前篇回顾:如何已知图片的url下载图片 本篇目标:下载一个类型集合的全部图片 使用urllib2获取,首先使用正则表达式获取本页图片的url,根据上篇所写downloadImg函数将图片下载到指定文件 ...

  8. Java爬虫---实战案例(爬取彼岸桌面壁纸)

    目录 步骤一:创建项目 步骤二:网页分析 1.在缩略图页面获取到详情页的超链接 2.在详情页页面获取到图片的下载地址 步骤三:图片下载 翻页功能 源代码 平时玩的爬虫都是用python写的,今天突发奇 ...

  9. Python运用urllib2和BeautifulSoup爬取网站ZOL桌面壁纸上的精美电脑壁纸

    Python运用urllib2和BeautifulSoup爬取网站ZOL桌面壁纸上的精美电脑壁纸 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...

最新文章

  1. (C++)1025 PAT Ranking
  2. hashtable源码解析
  3. jQuery源码学习(1)——addClass
  4. boost::core实现交换std::type_info
  5. php生成链接列表,根据URL链接和抛文本生成链接a标签的PHP函数
  6. Java-volatile是如何实现的
  7. 初中数学分几个模块_11.初中数学:xy4x+6y5,怎么因式分解?分组配方法再平方差...
  8. 景驰科技与联通实现全国首个5G网络下L4级无人驾驶应用
  9. 关于使用skimage.measure.shannon_entropy计算图像信息熵的问题
  10. 浙大python读者验证码_Python实现简单生成验证码功能【基于random模块】
  11. gpio能测Linux启动时间,linux – 如何自动测量新建图像的启动时间...
  12. Fastjson jar包下载地址
  13. .net core6 简单控制台读取数据库操作封装
  14. python画布上显示多张图片_python实现在一个画布上画多个子图
  15. 微信点击链接直接跳转手机默认浏览器下载APP的APK文件实现code
  16. ODL+Mininet环境搭配(Ubuntu18.04,Python3.7)
  17. 多颗微粒的阵列光镊系统设计
  18. Halcon图像修复
  19. .net 5+ 知新:【2】 .Net Framework 、.Net 、 .NET Standard的概念与区别
  20. html如何将网页分割开来,发现pdf文件页面内容太多,怎么把页面拆分开来?

热门文章

  1. 大宋国士——陈启文著
  2. 新项目代码导入idea注解报红处理
  3. 矩阵与矩阵相乘python代码实现
  4. 分位数回归、GAM样条曲线、指数平滑和SARIMA对电力负荷时间序列预测
  5. 知识分类——举步维艰
  6. null pointer exception解决方法
  7. JSX element implicitly has type ‘any‘ because
  8. 0924-安徽省选 2002-哈利●波特与魔法石
  9. with admin option 与with grant option 的区别
  10. DS1302时间+DS18B20测温+12864显示