Python小白最近入了爬虫的坑,但是一直到前天为止我会的只会简单的爬取网页上的文本信息,比如什么 豆瓣上的书评 ,知乎上红人的关注者 ……一些很简单的爬虫。就在昨天我无聊闲暇在逛知乎偶然发现Lyon所写的一篇文章,一片关于利用Python爬虫程序来爬精美的壁纸图。Awesome Wallpapers - wallhaven.cc​alpha.wallhaven.ccLyon:Python爬虫入门—图片下载​zhuanlan.zhihu.com

在发现文章采用的是面向对象的编写方式时我顿时慌了,因为在我之前所学习的简单爬虫中许多都是面向过程的编程而浅显易懂。瞄了一下该程序所用到的库,幸好发现都是学习过的,这大大使我更有底气往下阅读了,在阅读Lyon所写的代码,加上自己也跟着在旁编写加以逐层剖析+度娘大法,收益颇多。从中居然发现出该代码的小许缺陷,经过我多次对自己的反复排查并感觉这个就是bug的决定,我举起了勇气向Lyon私信指出了问题所在,(源码中的download()方法构造出所下载图片的html然后写入,但是根据我的观察该网站不止jpg格式的图片也包含png格式的图片,下载下来是无法正常显示的)。

万万没想到的是收到了回复,再次很感谢Lyon的指导回复。出于对自己的提高要求,我对此代码做出了一点在建立自己愚见上的修改,代码跟Lyon的大同小异,只是部分做出了修改。

说了这么多矫情了话是时候贴上代码了:(代码中包含了我的想法以及跟思路)

#!/usr/bin/env python

#-*- coding:utf-8 -*-

#author:Zisc

import os

import requests

import time

import random

from lxml import etree

keyWord = input(f"{'Please input the Keywords that you want to download:'}")

class Spider():

#初始化函数

def __init__(self):

self.headers = {

"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36",

}

self.filePath = ('E:\\keyWord\photo')#这是我保存图片的路径名

def creat_File(self): #用os修改目标保存路径

filePath = self.filePath

if not os.path.exists(filePath): #判断路径是否存在,没有则创建

os.makedirs(filePath)

def get_pageNum(self): #获取总页数

total=""

url = ("https://alpha.wallhaven.cc/search?q={}&categories=111&purity=100&sorting=relevance&order=desc").format(keyWord)

html = requests.get(url).text

selector = etree.HTML(html)

pageInfo = selector.xpath('//header[@class="listing-header"]/h1[1]/text()')

next_total = str(pageInfo[0])

for item in next_total:

if item.isdigit():

total = total + item

totalPagenum = int(total)

return totalPagenum

def getLinks(self,number):

"""

获取图片的连接,

这边的思路是先进入第一面爬取所有目标图片的请求链接,

比如page为1的时候获取了第一页所有的图片的响应连接(但是这个连接并不是我们最终下载所需的连接),

做for循环取出每一个响应连接再用xapth捉取最终下载连接(捉取得是//wallpapers.wallhaven.cc/wallpapers/full/wallhaven-399802.jpg),

所以在后面加上'https'拼接出完整的下载连接,存放在一个pic_downlist列表中。

:param number: *页

:return: 返回该页上每一张图片响应链接后的真实下载url

"""

url = ("https://alpha.wallhaven.cc/search?q={}&categories=111&purity=100&sorting=relevance&order=desc&page={}").format(keyWord,number)

pic_downlist = []

html = requests.get(url,headers=self.headers).text

selector = etree.HTML(html)

pic_Linklist = selector.xpath('//a[@class="jsAnchor thumb-tags-toggle tagged"]/@href')

print(pic_Linklist) #打印该页所有图片的响应链接

for item in pic_Linklist:

html_in = requests.get(item,headers=self.headers).text

selector_in = etree.HTML(html_in)

pic_willdownlist = selector_in.xpath('//*[@id="wallpaper"]/@src')

pic_get_url = "https:{}".format(str(pic_willdownlist[0]))

pic_downlist.append(pic_get_url)

return pic_downlist

def download(self,url,count):

"""

https://alpha.wallhaven.cc/网站上据我抽样点取,发现基本都是JPG,PNG格式的图片,

demo:"https://wallpapers.wallhaven.cc/wallpapers/full/wallhaven-635067.jpg"

"https://wallpapers.wallhaven.cc/wallpapers/full/wallhaven-626126.png "

要保存图片,必须就要在文件名上加上该格式得后缀,实在想不出办法只能出此愚见

(

在传入每一个该图片的url后做一个判断,判断该后缀后取出保存作为路径名

)

:param url: 在getLinks()上取得每一张图片响应链接后的真实url

:param count: 第*张图片

:return: None

"""

if url.endswith('.jpg'):

pic_path = (self.filePath + keyWord + str(count)+'.jpg')

elif url.endswith('.png'):

pic_path = (self.filePath + keyWord + str(count)+'.png')

try:

pic = requests.get(url, headers=self.headers)

f = open(pic_path, 'wb')

f.write(pic.content)

f.close()

print("Image:{} has been downloaded!".format(count))

time.sleep(random.uniform(0, 2))

except Exception as e:

print(repr(e))

def main_fuction(self):

#count是图片总数,times是总页面数

self.creat_File() #创建该工程保存目录

count = self.get_pageNum() #获得总图片数count

print("We have found:{} images!".format(count)) #打印出来有多少张图片

times = int(count / 24 + 1)#算出来有多少页

j = 1

for i in range(times): #每一页开始遍历

pic_Urls = self.getLinks(i + 1) #获取第一页

for item in pic_Urls: #在第一页获取的响应连接逐个开始遍历

self.download(item, j) #调用下载函数传入item作为url,j用来计数

j += 1

spider = Spider()

spider.main_fuction()

写在最后:

该代码不知道是不是我电脑cpu的问题运行起来略慢,给我感觉就是效率有点底,要爬1000张图片估计可能要等上半个多小时,各位有更好的优化思路欢迎一起讨论交流互相学习。

再次感谢Lyon!

用python画写轮眼_Python爬虫入门-图片下载(写轮眼--Lyon)相关推荐

  1. python小代码_Python爬虫入门有意思的小长代码

    一段有意思的代码,有兴趣的可以研究研究. 需求 用户收到短信如:购买了电影票或者火车票机票之类的事件.然后app读取短信,解析短信,获取时间地点,然后后台自动建立一个备忘录,在事件开始前1小时提醒用户 ...

  2. python爬虫图片工具安卓版下载_python爬虫之图片下载APP1.0

    今天给大家来个好玩一点的,运用python爬取图片到本地,网站为https://www.pexels.com/ 这个网站为外文网,所以搜索图片要用英语,今天要做的就是在python中进行搜索和下载图片 ...

  3. python源码_Python爬虫入门之获取网页源码

    爬虫,就是用程序代替人去访问网站,然后把网站上需要的东西拿下来:类似人输入网址,看到页面,然后复制粘贴,只是把这个过程自动化. 那么第一步就是去访问网站,要看到网站的页面,对程序来说也就是源码.笔者在 ...

  4. python爬虫获取图片无法打开或已损坏_Python爬虫,图片下载完后是损坏的,怎么解决?...

    coding:utf-8 import requests from bs4 import BeautifulSoup import os import sys reload(sys) sys.setd ...

  5. python很全的爬虫入门教程

    python很全的爬虫入门教程 一.爬虫前的准备工作 首先,我们要知道什么是爬虫 1.什么是网络爬虫? 网络爬虫是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁 ...

  6. python爬虫程序下载_Python爬虫之多线程下载程序类电子书

    近段时间,笔者发现一个神奇的网站:http://www.allitebooks.com/ ,该网站提供了大量免费的编程方面的电子书,是技术爱好者们的福音.其页面如下: ![](https://imag ...

  7. 基于Python实现的网络爬虫项目——多线程下载小说并保存为txt文件(包含完整代码及注释)

    基于Python实现的网络爬虫项目--多线程下载小说并保存为txt文件(包含完整代码及注释) 一.确立预期目标 二.完成项目所需工具 三.项目需要解决的问题 问题一 问题二 问题三 问题四 问题五 问 ...

  8. python爬虫爬图片教程_Python爬虫入门教程 5-100 27270图片爬取

    获取待爬取页面 今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位,大家重点学习思路,有啥 ...

  9. python谷歌网页爬虫_python爬虫入门01:教你在 Chrome 浏览器轻松抓包

    通过 python爬虫入门:什么是爬虫,怎么玩爬虫? 我们知道了什么是爬虫 也知道了爬虫的具体流程 那么在我们要对某个网站进行爬取的时候 要对其数据进行分析 就要知道应该怎么请求 就要知道获取的数据是 ...

最新文章

  1. sql datetime 加一天_PowerQuery数据库Sql.Database条件查询
  2. IntelliJ IDEA 2017 注册方法
  3. nodeValue以及其与value的区别以及JS nodeName、nodeValue、nodeType返回类型
  4. 关于Java栈与堆的思考
  5. jenkins 下载插件 一直失败_Jenkins安装与插件下载
  6. js计算器代码加减乘除_如何用jQuery做一个简易版计算器
  7. 错误: 没有forecast.Arima这个函数
  8. 【华为云网络技术分享】HTTP重定向HTTPS配置指南
  9. win7 ASP.NET 2.0 部署
  10. VHDL学习--分频器
  11. css中背景图像移动_深入了解:在CSS中使用编码图像(背景图像)
  12. matlab中prod函数、mean函数、median函数——小白MAT LAB学习笔记
  13. GIT LFS 原理杂谈
  14. python wow自动打怪脚本官方教程_【按键精灵】魔兽世界LR 自动打怪脚本
  15. r语言爬虫和python爬虫哪个好-R语言爬虫常用方法总结(以案例说明)
  16. MySQL统计排序,同分数同排名
  17. LeetCode-Python-1276. 不浪费原料的汉堡制作方案(鸡兔同笼 + 数学)
  18. SpringBoot按照restful风格统一异常返回
  19. 仿生学: 尺度和坐标轴
  20. KIBANA用户手册(一) DISCOVER-时间

热门文章

  1. idea中配置prettier
  2. 复现PTA人事机考照片审核的功能
  3. 蓝桥杯2019初赛 外卖店优先级 java
  4. 解决前端小程序Provisional headers are shown问题
  5. ANSYS | 模拟焊缝
  6. socketio python_python3--socketIO_client 摸索怕坑指南
  7. Linux下重命名文件或文件夹
  8. Docker容器实战(四) - 纷纷扰扰,终归尘土
  9. vhdl程序流程图的画法_编程基本功训练:流程图画法及练习
  10. 基于WPF框架—动画