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. Linux学习中我的10条建议和技巧
  2. Android获取和判断当前手机状态和信息
  3. 如何从 Python 列表中删除重复项
  4. 阿里云安装git_阿里云服务器快速建网站_安装BT宝塔面板和wordpress
  5. 【基础】ABAP不同变量类型之间数值大小比较
  6. SAP Marketing Cloud功能简述(三) 营销活动内容设计和产品推荐
  7. Ubuntu 16.04 安装CodeBlocks
  8. rabbitmq 消息长度_Spring Boot教程(29) – RabbitMQ必备基础
  9. windows开启ping功能
  10. android adb server didn't ack
  11. 【人工智能】“看透”神经网络
  12. php上传图片大小判断,jQuery实现判断上传图片类型和大小的方法示例
  13. python any all
  14. 韩荣温控器nx2使用说明书_如何查看您的Ecobee温控器的使用历史记录
  15. matlab处理波动的数据,波动数据时间序列的分析与处理
  16. WOWZA的安装及(VOD+LIVE)简单配置和VLC RTP推流
  17. 迈达斯GTS-NX网格模型(FPN)导入Flac3D 6.0
  18. 罗斯蒙特214CRTSMB1S3M0420SLM2AR1C1B1TBM2温度传感器
  19. 不能撑开盒子css,CSS padding在什么情况下不撑开盒子
  20. MYSQL数据库下载安装(Windows版本)

热门文章

  1. 数据库三大范式的理解(大白话篇)
  2. docker、nvidia-docker间的关系与安装
  3. [L4D]求生之路一代玩求生之路二代地图方法
  4. 图论算法——幻象迷宫(洛谷 P1363)
  5. PS教程!手把手教你打造复古几何无缝纹理背景
  6. Eclipse恢复默认操作界面和默认快捷键
  7. Systrace3 Why 60 fps
  8. Mac里面误删照片怎么恢复
  9. 北大POJ 1000 ~ 1009
  10. Vue路由传参相关面试题