Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

其实很多编程语言都可以做爬虫,例如java、c#、php等等甚至excel都可以抓网页的图表,那么为什么我们要用Python呢?它简单、便捷,而且有好多库可以选择,可以说python是写爬虫的首选了!

今天就来带大家写一个简单而又完整的爬虫,我们来抓取整站的图片的,并且保存到电脑上!

准备工作

工具:Python3.6、pycharm

库:requests、re、time、random、os

目标网站:妹子图(具体url大家自己去代码里看。。。)

在写代码之前

在我们开始写代码之前,要先对网站进行分析,重点有这个几个地方:

1、先判断网页是否静态网页,这个关系我们采用的爬虫手段!

简单的说,网页中的内容,在网页源代码中都可以找到,那么就可以断定,这个网站是静态的了;如果没有找到,就需要去开发者工具中查找,看看是抓包呢还是分析js结构或者其他的方式。

2、看看网页的结构,大致清楚抓取目标数据,需要几层循环,每次循环的方式,以及是否保证没有遗漏!

3、根据网页源代码来决定采用的匹配方式

一般来说,正则表达式是处理字符串最快的方式,但是在爬虫中它的效率并不是很高,因为它需要遍历整个html来匹配相关内容,如果网页源代码比较规整的话,建议采用bs4或者xpath等等解析网页结构的方式比较好!

当然,今天我们是基础向的爬虫,就用正则表达式了,毕竟正则是必须掌握的内容!

那么,具体怎么写爬虫代码呢~?简单的举例给大家说下:

如果是手工操作的话,大概是这个流程

打开主页==>选择一个分类==>选择一个图集==>依次选择图片==>右键保存==>重复以上保存其他图片

那么这个过程放到代码中呢,它的结构大概是这样:

访问主页url==>找到并循环所有分类==>创建分类文件夹==>访问分类url==>找到页码构建循环分类所有页==>循环页面所有图集==>创建图集文件夹==>找到图集内所有图片url==>保存到对应文件夹

好了,思路也有了,那就废话不多说了,我们来写代码吧~!

开始写代码

首先是导入上述的各种库,没有的需要安装一下!然后写入以下几行代码获取网页源代码看看是否有反爬:

import requests

import time

import random

import re

import os

url = 'http://www.meizitu.com/'

html = requests.get(url)

html.encoding = 'gb2312'

如果能顺利打印出源代码且和网页右键查看的源代码一致,那么可以判定该网站基本没有反爬了!

第16行代码的含义是给html设定编码格式。因为Python3默认是utf-8,如果网站不是这个编码格式的话,会出现乱码,所以我们直接指定一下。

接下来呢,就是找到所有分类的名字和url了,来看看网页中和源代码中,它的位置在哪

全部在a标签的属性中,那么我们可以用一行代码获取了

infos = re.findall(r'a href="(http://www.meizitu.com/.*?html)" target="_blank" title="(.*?)" ',html.text)

这里用正则匹配,2个括号中的内容就是我们需要的url和名字了,然后开始构建循环遍历所有的分类

上一步取出的infos是列表,而且每一个元素都是一个元组,格式为(url,名字),所有我们用2个元素去遍历infos,来获取我们需要的内容,先打印下看看结果是否正确!

这里先不创建文件夹,先进行下一步,访问分类的url,然后开始构建分类中的页码吧!分析网页发现,所有的页码都在下方,但是还是稍有不同:没有当前页、多了下一页和末页

由于存在图集不足一页的情况(上述源代码就不会出现),所以我们这么处理循环

19-21行获取分类的源代码,22行获取所有页码的url,然后用set()函数去重,再新建一个空列表,将分类的url加进去,注意,元组是不能用append()方法添加到列表中的,所以要先将set元组转化为列表然后分别重新拼接列表内所有的url,在将2个列表相加的方式合并为一个列表!这样我们就得到了分类下所有翻页页面的url

循环所有的url,获取所有图集的url列表,27行没有用encoding指定编码是因为这里我不需要取到中文的内容,所以简写了一下!终于该取图片了!

图集的title和图集内所有图片的url都取到了!其实到这里就已经完成了爬虫的80%了!剩下的20%就是保存图片到本地,这里就不多说了,给大家提供2个代码片段,一个是新建文件夹并判断是否存在,一个是剔除字符串内不符合命名要求的字符

path = 'E://python/mn/meizitu/%s/'%sor#路径

if os.path.exists(path):#判断路径及文件夹是否存在,不存在即创建

pass

else:

os.mkdir(path)

def new_title(title):

rstr = r"[\/\\\:\*\?\"\<\>\|]" # '/ \ : * ? " < > |'

new_title = re.sub(rstr, "_", title) # 替换为下划线

return new_title

最终完整代码和运行效果

在请求中加入了时间模块的暂停功能,不加入的话可能会被网页拒绝访问!

在最后请求图片地址的时候,需要加入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

下载一段时间后的效果

文章

Web App开发 · 数据采集 · Python · atlas · Windows · C# · JavaScript · Java · PHP · 开发者

2018-07-14

python妹子图_python 妹子图的搜索结果-阿里云开发者社区相关推荐

  1. python调用 matlab库_python调用matlab的搜索结果-阿里云开发者社区

    2018python技术问答集锦,希望能给喜欢python的同学一些帮助 小编发现问答专区中有很多人在问关于python的问题,小编把这些问题汇总一下,希望能给喜欢python的大家一些启示和帮助 本 ...

  2. python 黑客工具开发_python黑客软件的搜索结果-阿里云开发者社区

    带你读<Python科学计算(原书第2版)>之一:导论 计算机科学丛书点击查看第二章点击查看第三章Python科学计算(原书第2版)Python for Scientists, Secon ...

  3. 如何阅读python文档_python 文档怎么看-问答-阿里云开发者社区-阿里云

    调用help函数,可以看到一个函数或者方法的字符串文档. In [1]: import requests In [2]: help(requests.get) Help on function get ...

  4. python单元测试断言_Python单元测试框架之pytest -- 断言-阿里云开发者社区

    对于测试来讲,不管是功能测试,自动化测试,还是单元测试.一般都会预设一个正确的预期结果,而在测试执行的过程中会得到一个实际的结果.测试的成功与否就是拿实际的结果与预期的结果进行比较.这个比的过程实际就 ...

  5. python中右对齐_python中如何右对齐-问答-阿里云开发者社区-阿里云

    例如,有一个字典如下: dic = { "name": "botoo", "url": "http://www.123.com&q ...

  6. 大数据中心成立ppt_云计算数据中心 ppt的搜索结果-阿里云开发者社区

    [0713 - 0717 直播导视 | PPT 下载]新品众星云集:阿里云存储新品发布会.mPaaS 小程序新品发布会.阿里云ECS新品发布会 *本预告时间仅供参考,最终直播时间以直播间信息为准.*本 ...

  7. python 做网站 知乎_python做网站 知乎的搜索结果-阿里云开发者社区

    伤不起的全栈程序员 前段时间听说一个新名词:"全栈程序员",google了一下,被引导到了知乎的一个讨论上: http://www.zhihu.com/question/22420 ...

  8. python读取mssql文件_python 读取mssql数据库中文的搜索结果-阿里云开发者社区

    sphinx 配置文件全解析 sphinx的配置文件是在配置的时候最容易出错的了: 我们先要明白几个概念: source:数据源,数据是从什么地方来的. index:索引,当有数据源之后,从数据源处构 ...

  9. python听歌识曲爬虫_Python爬取网易云音乐热门评论的搜索结果-阿里云开发者社区...

    网易云音乐评论爬虫(三):爬取歌曲的全部评论 用过网易云音乐听歌的朋友都知道,网易云音乐每首歌曲后面都有很多评论,热门歌曲的评论更是接近百万或者是超过百万条.现在我就来分享一下如何爬取网易云音乐歌曲的 ...

最新文章

  1. [转]JSP常用指令
  2. Sparse Feature Learning
  3. react-native 第三方库
  4. 基于vue(element ui) + ssm + shiro 的权限框架
  5. 插入数据并返回插入数据ID
  6. u盘写保护,无法格式化
  7. matlab 检验异方差,stata中面板数据异方差的处理_stata面板异方差检验
  8. 国家级赛事正式开赛 | 2019数字中国创新大赛上线
  9. php 分页样式css样式,thinkphp5分页CSS样式代码
  10. disallow .php,一次解决discuz只收录首页,不收录内页的问题,景安虚拟主机discuz帖子伪静态设置解决办法...
  11. 常见的麦克风供电方式总结(驻极体电容器麦克风)
  12. 进程和程序区别和联系
  13. Simulink建模:一阶滤波模型
  14. linux笔记(第三周)
  15. C语言 输出百分号(%)的方法
  16. 利用matlab的SPM12功能核磁共振成像数据处理_Auditory fMRI data(二)
  17. Harbor搭建私有仓库
  18. cut out数据增强_常见的数据增强项目和论文介绍
  19. 设计模式之禅《一》 大旗不挥,谁敢冲锋 ——6大设计原则
  20. 简单使用matlab做回归分析、拟合分析

热门文章

  1. 【数据压缩(五)】LZW编解码c语言实现和分析
  2. activiti流程设计到表
  3. Pandas的Series转换为DataFrame
  4. 网络防火墙 之 初探Iptables
  5. 压敏电阻的工作原理,结构,分类与应用场总结
  6. 噪声的频谱分析的重要意义_频谱分析仪的作用以及使用功能介绍
  7. 融资租赁租前、租中、租后风险管理分析大全
  8. c语言编程季节输出春夏秋冬,c语言编程题: 用枚类型定义春、夏、秋、冬四个季节...
  9. django分页实现
  10. 100的阶乘末尾有多少个零