几十行代码批量下载高清壁纸 爬虫入门实战
爬取图片
概述
电影桌面背景时间长了也会腻,换背景的话一般去网上下载又需要挑来挑去,一页一页的翻很烦人,能不能一次展示很多图片呢?省的一页一页看。比较简单的方法就是把图片存到本地,然后一次性看所有图片。本部分就是写一个没有任何复杂结构的爬虫去把网上的图片爬取到本地。
任务分析
需求是从网上获取一些比较好看的电脑壁纸,采用爬虫的实现策略。
1.找到需要爬取的图片网站,在这里我以彼岸图网为例
2.选择恰当的爬取方式,由于本任务过于简单,因此就直接写一个爬虫就行。
爬虫设计
说是设计,其实就是说一下爬虫的基本构成。爬虫一般分为几步(这里把步骤拆分到最小)。
1.确认你抓取目标的url(核心在于查找),这部分一般观察即可,要注意首页的重定向问题。
2.使用Python代码发送请求获取数据(java go)
3.解析获取到的精确数据, 找到新的目标(新的url)回到第一步(自动化)
4.数据持久化(保存到本地)
爬虫实现
在实现时,我直接把数据解析和数据存储放在了一起,你也可以拆分为两个方法。
对于刚刚接触爬虫的人而言,难点在于如何从一堆代码中找到自己需要的内容。
数据解析一般分为三类:正则表达式、xpath、bs4.推荐后两种,当然如果是大佬也可以使用第一种,我个人倾向于使用xpath,因此下文也是使用xpath实现的。本项目是我当时作为入门项目做的,很适合新手入门。
import urllib
import os
import requests
from bs4 import BeautifulSoup
from lxml import etree
import json
class PicSpider(object):
def __init__(self):
self.base_url = "http://pic.netbian.com/4kdongwu/index_{}.html"
self.headers = {
# 浏览器版本
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) "
"Chrome/14.0.835.163 Safari/535.1",
}
# 1.构建所有url
def get_url_list(self):
url_list = []
for i in range(2, 4):
url = self.base_url.format(i)
url_list.append(url)
return url_list
# 2.发送请求
def send_request(self, url):
print(url)
data = requests.get(url, headers=self.headers).content.decode('gbk')
return data
# 3.解析存储数据
def parse_data(self, data):
tree = etree.HTML(data)
li_list = tree.xpath("//div[@class='slist']//li")
for li in li_list:
pic_name = li.xpath('./a/b/text()')[0]
pic_url = 'http://pic.netbian.com' + li.xpath('./a/img/@src')[0]
print(pic_url)
pic_path = './imgs/' + pic_name + '.jpg'
urllib.request.urlretrieve(url=pic_url, filename=pic_path)
def start(self):
if not os.path.exists('./imgs'):
os.mkdir('./imgs')
url_list = self.get_url_list()
# 循环遍历请求
for url in url_list:
data = self.send_request(url)
self.parse_data(data)
PicSpider().start()
在初始化时,有一个参数叫User-Agent,该参数被称为请求头,有些网站(几乎没有)中可以不用请求头,所以这个参数可以称之为必填参数,获取地方在你的浏览器network下。
由于这个网站就是的Url的变化在index_{}这,所以base_url定义为:
self.base_url = "http://pic.netbian.com/4kdongwu/index_{}.html"
在步骤1中,就是利用for循环构建所要访问的url列表,range(开始页,终止页)。
在请求时采用第三方模块requests,其实应该要会Python自带的urllib的request,毕竟这个是原生的。
解析数据就是采用xpath解析的。
由于在src下获取的是url的一部分,因此多了url的二次拼接,也就是第38行的代码
pic_url = 'http://pic.netbian.com' + li.xpath('./a/img/@src')[0]
接着就是创建一个文件夹存储就ok了。
结果展示
运行过程中为了显示获取进度,可以把url打印出来。
结果存在同级目录下的imgs文件夹下。
- jdk源码分析红黑树——插入篇1.插入root2.父黑3.父红4.父红,叔红5.1父红,叔黑,外侧子孙5.2父红,叔黑,内侧子孙
- WIFI环境下Android手机和电脑通信
- 破解之美:利用ECB加密缺陷突破cookie加密
- 让Python猜猜你是否能约会成功
- python学习笔记之初识Python
- 从APK解密到批量获取他人信息
- React native和原生之间的通信
- 移动云存储服务平台Parse下的iOS安全分析
- 经典算法学习之回溯法
- 渗透测试系统BackBox Linux 4.1发布
- CMS漏洞检测工具 - CMSmap
- 基因组分析中多物种同源基因的鉴定和筛选
- SpringMVC类型转换器、属性编辑器PropertiesEditor源码分析CustomDateEditor源码分析TypeConverterDelegate源码分析
- Intellij IDEA 插件开发之自建插件仓库
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一文搞定pandas的透视表
- Spring 日志输出错误字符 -e[0;39m e[2m[
- linux不支持所有命令的解决办法
- linux系列之常用运维命令整理笔录(小结)
- 轻松掌握Git开发(五)远程库的基本操作
- GitHub竟然还有这些骚操作,赶紧学起来
- leetcode之单词规律
- 内存溢出及解决方案
- 3分钟短文:Laravel控制器用法光速入门
- Linux查看ip的实例方法
- Ubuntu18.04通过源码安装Odoo14的教程
- Linux系统中SSH服务基于key认证实践的过程
- linux防墙iptables详细介绍、配置方法与案例
- Linux unlink函数和删除文件的操作方法
- Linux seq命令的使用详解