env : python 3.7
data : 2019/09/26
author : lrcoder
爬取 simpledesktops 壁纸图片
先贴码
from urllib import request
import requests
from lxml import etree
import os
# 将爬虫需要的请求头抽取出来
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36',
'Referer': 'http://simpledesktops.com/browse/'
}
# 声明一个图片列表,用于存储请求下来的图片对象
pictures = []
# 请求HTML的函数,返回的是一个字符串格式
def get_page(url, header):
# 请求页面
text = requests.get(url, headers=header)
# 设置HTML的编码格式
page = text.content.decode('utf-8')
return page
# 解析HTMl的函数
def syncHtml(page):
# 将page字符串转化为一个HTML
html = etree.HTML(page)
# 获取HTML中的所有带有src属性的图片
imgs = html.xpath('//img[@src]')
# 遍历这个图片列表
for img in imgs:
# 获取图片title
title = format(img.xpath('./@title'))[2:-2].split(' ')[0]
# 获取预览图片地址
url = format(img.xpath('./@src')).split('.')
src1 = format(url[0] + '.' + url[1] + '.' + url[2] + '.' + url[3])
# 获取图片的实际地址
src = src1.split('\'')[1]
# 获取图片格式
type = format("." + url[3])
# 创建一个图片字典,保存一个图片对象
picture = {
'title': title,
'src': src,
'type': type
}
# 向图片列表追加图片对象
pictures.append(picture)
return pictures
if __name__ == '__main__':
# 这边控制爬取多少页的图片(我这里是20页)
for i in range(1, 21, 1):
# 请求HTML
page = get_page(url='http://simpledesktops.com/browse/' + format(i) + "/", header=header)
# 解析HTML,获取图片列表
pictures = syncHtml(page)
print("已成功爬取第" + format(i) + "页内容!")
# 遍历图片列表
for picture in pictures:
# 格式化图片名字
imgName = format("%s" % picture['title']).replace('/', '')
# 判断图片是否已经存在(这个网站的不同页面会有重复图片)
if os.path.exists(format(
'C:\\Users\\27414\\Pictures\\Saved Pictures\\' + "%s" % picture['title'] + "%s" % picture["type"])):
print("%s" % picture['title'] + " 已存在 :)")
else:
print("当前正在下载 " + imgName + ", 请稍后... ...")
# 保存至本地,设置路径,设置文件标题、格式
request.urlretrieve("%s" % picture["src"], format(
'C:\\Users\\27414\\Pictures\\Saved Pictures\\' + imgName + "%s" % picture["type"]))
print(imgName + " 下载完成!")
再吹牛
-
简单的爬虫程序一般分为三个部分:
- 打着我不是爬虫的旗号请求页面
- 使用合适的方式对请求下来的页面进行解析
- 对其中需要的数据进行操作(下载?显示?)
-
本次的小程序使用到的模块(和上述步骤一一对应)
- requests网络请求模块(用于请求HTML页面)
- XPath解析
- request模块中的urlretrieve函数(用于将网络图片保存至本地)
- os模块(判断文件是否已经存在)
simpledesktops网站页面结构分析
- 网页地址规律
页面 | 地址 |
---|---|
第一页 | http://simpledesktops.com/browse/1/ |
第二页 | http://simpledesktops.com/browse/2/ |
第三页 | http://simpledesktops.com/browse/3/ |
第九页 | http://simpledesktops.com/browse/9/ |
拿到网页链接:
for i in range(1, 21, 1):
url='http://simpledesktops.com/browse/' + format(i) + "/"
- 网页结构规律
这边推荐使用Chrome中的
XPath Helper
插件,该插件可以在网页中进行XPath实时预览
- 获取页面中的所有带有
src
属性的图片 ---->//img[@src]
- 获取上述图片中的
title
属性(文件名) ---->//img[@src]/@title
- 获取上述图片中的
src
属性(下载地址) ---->//img[@src]/@src
这边我们主要来看一下,第三步咱们获取到的图片地址格式,例如:
1.http://static.simpledesktops.com/uploads/desktops/2019/06/22/Dinosaur_eye_2.png.295x184_q100.png
2.http://static.simpledesktops.com/uploads/desktops/2014/12/04/Pencil_Big.png.295x184_q100.png
3.http://static.simpledesktops.com/uploads/desktops/2016/11/04/square-bees.png.295x184_q100.png
以第一个uri为例:
http://static.simpledesktops.com/uploads/desktops/2019/06/22/
---> 可能是图片的上传位置和上传时间(这不重要)
Dinosaur_eye_2
---> 图片名
.png
---> 图片格式
.295x184
---> 图片大小
_q100
---> 不知道是啥?
.png
---> 再来个图片格式
以上获取的是预览图(295x184),我们点击图片进去后发现该图片的uri为:
http://simpledesktops.com/browse/desktops/2019/jun/22/dinosaur-eye/
也就是说我们需要去掉.png.295x184_q100.png
的部分,所以我们就拿到了图片的文件名、格式、地址,也就代码中的以下部分
# 获取页面上的所有带有src属性的图片
imgs = html.xpath('//img[@src]')
# 对图片标题进行一些字符串格式化上的操作
title = format(img.xpath('./@title'))[2:-2].split(' ')[0]
# 获取图片的地址,截取其中的地址
url = format(img.xpath('./@src')).split('.')
src1 = format(url[0] + '.' + url[1] + '.' + url[2] + '.' + url[3])
src = src1.split('\'')[1]
# 获取图片格式,作为保存在本地的文件后缀
type = format("." + url[3])
总结
本人学习python仅仅是对网络爬虫有些许兴趣,本职工作还是Android开发,这个小Demo仅仅是作为爱好编写的,程序的可扩展性不强,仅做参考。代码中的注释比较多,下文作为自己对代码由来的分析,望大佬勿喷。各位发现bug也可以在评论里提出来,我会及时改正。
网友评论