python爬虫系列之 xpath实战:批量下载壁纸

一、前言

在开始写爬虫之前,我们先了解一下爬虫

首先,我们需要知道爬虫是什么,这里直接引用百度百科的定义

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

这些还不够,我们还需要知道爬虫爬取数据的基本步骤。

爬虫爬取数据一般分为三个步骤

  1. 获取网页 巧妇难为无米之炊。我们需要的是数据全在网页里,拿不到网页,代码敲得再好也没用。所以一个爬虫的第一步一定是获取网页。
  2. 提取信息 拿到网页之后,我们要做的就是分析网页结构,定位要爬取的信息,然后提取出来
  3. 保存信息 获得信息之后,一般需要把信息保存起来以便下次使用

完成上面三步一个简单的爬虫就写好了( ̄▽ ̄)",下面开始写壁纸爬虫

二、开始写爬虫

我们要爬取的目标网站是:http://www.netbian.com/,这个网站长这样:

picture-1

红色方框里的就是我们要爬取的图片。

在动手写代码之前,我们要先理一理思路,这样可以让思路更清晰,写代码时就会更流畅,代码也更简洁。

对于一个爬虫脚本,我们一般需要考虑以下几点:

  1. 爬什么:我们要从网页上获取的数据是什么
  2. 怎么爬:用什么库?是否需要使用框架?有没有 ajax接口?
  3. 爬取步骤:哪个先爬,哪个后爬

以我们的项目为例:

  1. 爬什么: 我们的目标是下载网页中的图片,要下载图片就要先获得图片的地址,而图片的地址就在网页中。 所以我们需要爬取网页中图片的地址。
  2. 怎么爬: 图片在几十到几百张之间,下载量不大,不需要使用框架,直接使用 requests库。 解析网页使用 xpath。
  3. 爬取步骤: 第一步:分析网页,写出图片的 xpath路径 第二步:用 requests库获取网页 第三步:使用 lxml库解析网页 第四步:通过 xpath获得图片链接 第五步:下载图片 第六步:命名并保存图片

分析完之后,就开始爬取了!

首先第一步,分析网页,在浏览器里打开网页,按下 F12进入开发者模式,选择 Elements选项卡,如图:

picture-2

使用元素选择器:

picture-3

找到标签后,我们就可以写出标签的 xpath路径,这个比较简单,就不详细写了。有疑问的可以评论留言。

图片标签的 xpath路径:

#图片地址
path = '//a[@title]/img/@src'
#为了方便给图片命名 顺便把图片名字也爬下来
name = '//a[@title]/img/@alt'

接下来就是应用我们所学的时候了,话不多说,直接上代码:

#-*- coding: utf-8 -*
import requests
from lxml import etree


#网站地址
url = 'http://www.netbian.com/'

#获取网页
r = requests.get(url)
r.encoding = r.apparent_encoding
#解析网页
dom = etree.HTML(r.text)

#获取图片 img标签
#先获取图片所在的 img标签在分别获取图片链接和名字
img_path = '//a[@title]/img'
imgs = dom.xpath(img_path)

#获取图片的链接和名字 并下载 命名 保存
for img in imgs:
    #xpath 的相对路径 “.” 代表上一级标签
    #不要忘记 xpath返回的总是列表!
    src = img.xpath('./@src')[0]
    name = img.xpath('./@alt')[0]

    #下载图片
    image = requests.get(src)
    #命名并保存图片
    with open(name+'.jpg', 'wb') as f:
        f.write(image.content)

运行结果:

picture-4

这样我们就完成了一个简易版的壁纸爬虫,为什么说是简易版呢,理由如下:

  1. 图片太小了,根本不能用作壁纸(其实是我偷懒了( ̄▽ ̄)"),要获取高清壁纸的话,还需要点击图片进入下一个页面,简单起见我直接爬了首页的缩略图。
  2. 不能自动翻页,运行一次只能下载一页的图片,翻页可以获取网页中下一页的链接,或者寻找网址的变化规律

有兴趣的朋友可以继续完善上面两个问题,可以把问题发在评论区,我会一一查看的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯NEXT学位

小程序初学者必读——小程序的简单入门

2263
来自专栏更流畅、简洁的软件开发方式

分页控件的使用能不能再简单一点呢,能不能一个页面搞定所有的列表需求?

目的: 1、一个页面(DataList.aspx)可以显示多个模块的列表功能。      一般是有一个列表需求就需要一个aspx文件,如果有100个列表,...

3215
来自专栏张戈的专栏

原创插件:WordPress博客友好对话框+文章随机推荐滚动条插件(附代码版)

双 11 光棍节,我在博客发布了一篇给博客部署一个友好对话框的教程,用了几天感觉非常不错!就进一步折腾了一下,目前这个 js 已实现以下多种功能: 一、功能描述...

48412
来自专栏守望轩

Visual Studio 2008 每日提示(七)

#061、增大编辑器工具提示的字体 原文地址:http://blogs.msdn.com/saraford/archive/2007/10/15/did-yo...

2704
来自专栏葡萄城控件技术团队

一个Web页面的问题分析

几个月之前我接到一个新的开发任务,要在一个旧的Web页面上面增添一些新的功能。在开发的过程中发现旧的代码中有很多常见的不合适的写法,结合这些问题,如何写出更好的...

2049
来自专栏macOS 开发学习

Mac开发之 Cocoa 绑定 入门

从iOS开发转为Mac OSX应用开发的过程中,cocoa 绑定算是比较大的一个差异,也是OSX上比较实用的技术,cocoa 绑定让开发者节省了大量的代码,可以...

1062
来自专栏向治洪

Vue.js快速入门

Vue.js简介 Vue.js(读音 /vjuː/, 类似于view)是一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设...

2739
来自专栏重庆的技术分享区

Vim定制化简介

Vim是几乎所有Unix系统中都会存在的少数文本编辑器之一。虽然最初的学习曲线是不可避免的,但Vim的目标是成为一个高效的文本编辑器,并提供一个根据用户喜好可配...

1312
来自专栏葡萄城控件技术团队

Angular的12个经典问题,看看你能答对几个?(文末附带Angular测试)

Angular作为目前最为流行的前端框架,受到了前端开发者的普遍欢迎。不论是初学Angular的新手,还是有一定Angular开发经验的开发者,了解本文中的12...

2148
来自专栏Google Dart

AngularDart4.0 指南-体系结构概述 顶

AngularDart(我们通常在这个文档中简单地称为Angular)是一个框架,用于在HTML和Dart中构建客户端应用程序。它是作为Angular包发布的,...

853

扫码关注云+社区

领取腾讯云代金券