Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!
今天就来带大家写一个简单而又完整的爬虫,我们来抓取整站的图片的,并且保存到电脑上!
准备工作
工具:Python3.6、pycharm
库:requests、re、time、random、os
目标网站:妹子图(具体url大家自己去代码里看。。。)
在写代码之前
在我们开始写代码之前,要先对网站进行分析,重点有这个几个地方:
1、先判断网页是否静态网页,这个关系我们采用的爬虫手段!
简单的说,网页中的内容,在网页源代码中都可以找到,那么就可以断定,这个网站是静态的了;如果没有找到,就需要去开发者工具中查找,看看是抓包呢还是分析js结构或者其他的方式。
2、看看网页的结构,大致清楚抓取目标数据,需要几层循环,每次循环的方式,以及是否保证没有遗漏!
3、根据网页源代码来决定采用的匹配方式
一般来说,正则表达式是处理字符串最快的方式,但是在爬虫中它的效率并不是很高,因为它需要遍历整个html来匹配相关内容,如果网页源代码比较规整的话,建议采用bs4或者xpath等等解析网页结构的方式比较好!
当然,今天我们是基础向的爬虫,就用正则表达式了,毕竟正则是必须掌握的内容!
那么,具体怎么写爬虫代码呢~?简单的举例给大家说下:
如果是手工操作的话,大概是这个流程
打开主页==>选择一个分类==>选择一个图集==>依次选择图片==>右键保存==>重复以上保存其他图片
那么这个过程放到代码中呢,它的结构大概是这样:
访问主页url==>找到并循环所有分类==>创建分类文件夹==>访问分类url==>找到页码构建循环分类所有页==>循环页面所有图集==>创建图集文件夹==>找到图集内所有图片url==>保存到对应文件夹
好了,思路也有了,那就废话不多说了,我们来写代码吧~!
完整代码和运行效果
在请求中加入了时间模块的暂停功能,不加入的话可能会被网页拒绝访问!
在最后请求图片地址的时候,需要加入UA来告诉服务器你是浏览器而不是脚本,这个是最常用的反爬手段了
#author:云飞
#QQ群542110741
import requests
import time
import random
import re
import os
def new_title(title):
rstr = r"[/\:*?"<>|]" # '/ : * ? " < > |'
new_title = re.sub(rstr, "_", title) # 替换为下划线
return new_title
url = 'http://www.meizitu.com/'
html = requests.get(url)
html.encoding = 'gb2312'
infos = re.findall(r'a href="(http://www.meizitu.com/.*?html)" target="_blank" title="(.*?)" ',html.text)
i = 1
for sor_url,sor in infos:
sor = new_title(sor)
path = 'E://python/mn/meizitu/%s/'%sor#路径
if os.path.exists(path):#判断路径及文件夹是否存在,不存在即创建
pass
else:
os.mkdir(path)
time.sleep(random.random())
sor_html = requests.get(sor_url)
sor_html.encoding = 'gb2312'
atlas = set(re.findall(r"<li><a href='(.*?html)'>d+</a></li>",sor_html.text))
atlas_lis = []
atlas_lis.append(sor_url)
atlas_lis += [url+'a/'+x for x in list(atlas)]
for atla in atlas_lis:
atla_html = requests.get(atla).text
at_url_lis = re.findall(r'h3 class="tit"><a href="(http://www.meizitu.com/.*?html)" targe',atla_html)
for at_url in at_url_lis:
at_html = requests.get(at_url)
at_html.encoding = "gb2312"
atlas_title = ''.join(re.findall(r'<title>(.*?)</title>',at_html.text))
atlas_title = new_title(atlas_title)
img_path = 'E://python/mn/meizitu/%s/%s/'%(sor,atlas_title)
if os.path.exists(img_path):#判断路径及文件夹是否存在,不存在即创建
pass
else:
os.mkdir(img_path)
img_urls = re.findall(r'src="(http://mm.chinasareview.com/.*?jpg)" /><br />',at_html.text)
k = 1
for img_url in img_urls:
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0'}
data = requests.get(img_url,headers=header).content#获取图片的二进制格式
with open('%s%s'%(img_path,img_url.split('/')[-1]),'wb') as f:
f.write(data)
print("【正在下载】 {%s}的第%d张图片,一共下载了%d张图片"%(atlas_title,k,i))
i += 1
k += 1
下载一段时间后的效果
------------------- End -------------------
欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
万水千山总是情,点个【在看】行不行
*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。
/今日留言主题/
随便说一两句吧~~
- SpringData JPA就是这么简单
- Openflow细节理解之—Buffer_id篇
- 移动商城项目总结
- 移动商城第一篇【搭建项目环境+数据模型】
- 移动商城第二篇(品牌管理模块)【文件上传、数据校验、CRUD】
- 手把手在亚马逊EC2上搭建Keras GPU
- 移动商城第三篇(商品管理)【查询商品、添加商品】
- 移动商城第四篇(商品管理)【添加商品续篇、商品审核和上下架、前台展示、后台筛选】
- 移动商城第五篇(用户模块)【用户登陆、回显用户、拦截器、收货地址】
- 移动商城第六篇【单品查询、静态化页面】
- 移动商城第七篇【购物车增删改查、提交订单】
- Shiro入门这篇就够了【Shiro的基础知识、回顾URL拦截】
- OFTest(一):如何忽略一些字段在端口poll报文
- Shiro第二篇【授权、整合Spirng、过滤器】
- 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 数组属性和方法