老司机带你用python来爬取妹子图
这是日常学python的第14篇原创文章
我前几篇文章都是说一些python爬虫库的用法,还没有说怎样利用好这些知识玩一些好玩的东西。那我今天带大家玩好玩又刺激的,嘻嘻!对了,requests库和正则表达式很重要的,一定要学会!一定要学会!!一定要学会!!!我现在的爬虫基本都是用这两样东西来爬的。所以学不学你看着办吧。
来到今天的重点,我今天发现一个网站很好爬的,非常适合新手,我没有设置请求头什么的爬了很多遍很没有封我ip和给我返回403之类的,所以他对我们第一次玩爬虫的人来说很友好。这个网站就是今日头条。最重要的是这里面有很多美女图片,我们可以把它们爬下来!!!是不是想想都要流鼻血啊?
文章首发于公众号「日常学python」
我们今天要爬的就是他的图集,先看看网站。搜索美女,然后点击图集,可以看到下面这些内容
我们要做的就是把上面的图片给爬下来。
那开始分析网站。按下f12,然后点击network,刷新下你可以看到这些
进行寻找哪个请求返回这些图片的,在网页上可以看到图片会随着你下拉网页而进行显示更多的图片,这是动态加载的,所以可以轻松知道这个可以在xhr文件中找到,果然,你看
不断往下拉,不断地发送请求,点击这个请求看看是返回什么数据
可以看到这是个json,里面有图片的url,这个就是我们要找的东西,那我们可以用json库来解析,还有这个网站是get请求,这样就可以用requests库来发送然后解析下就可以了,非常简单。
那么分析就到这里,直接上代码
import requests, os
path_a = os.path.abspath('.')
kw = ''
while True:
kw = input('请输入你要获取的图片(若想结束请输入1)')
if kw == '1':
print('已退出,你下载的图片已保存在'+path_a+',请查看!')
break
for x in range(0, 1000, 20):
url = 'https://www.toutiao.com/search_content/?offset='+str(x)+'&format=json&keyword=%s&autoload=true&count=20&cur_tab=3&from=gallery' % kw
response = requests.get(url)
data = response.json()['data']
if not data:
print('下载'+kw+'图片完毕,请换个关键词继续')
break
n = 1 # 记录文章数
for atlas in data:
# 创建目录
title = atlas['title']
print(atlas)
try:
if title not in os.listdir('.'): # 防止文件名已经存在
os.mkdir(title)
except OSError as e:
print('文件名出错,创建目录失败,重新创建一个随机名字')
title = kw + '文件名出错'+str(x)
if title not in os.listdir('.'):
os.mkdir(title)
k = 1 # 记录下载的图片数
path = os.path.join(path_a, title)
# 转进图片目录
os.chdir(path)
for image in atlas['image_list']: # 这个链接获取的图片是小张的,看着不够爽,所以下面替换成大的图片
image_url = image['url'].replace('list', 'large') # 改个链接获取大的图片
atlas = requests.get('http:'+image_url).content
with open(str(k)+'.jpg', 'wb') as f: # 把图片写入文件内
f.write(atlas)
print('下载完第%d个文章的%d幅图完成' % (x+n, k))
k += 1
n += 1
# 转出图片目录
os.chdir(path_a)
这个只用了requests库基本就能完成了,os库是用来操作文件目录的,这里就不详细说了。可以看到,代码量非常少,除开注释就大概四十行吧,是不是比其他语言简洁多了?是不是requests库很好用?这里可以充分体现了人生苦短,我用python的真理。
而且,他还可换关键字继续搜,你想搜什么照片都可以。
下篇文章写个requests库和正则来爬内容的文章,让你们感受下正则的强大!
最后给你们看下结果
不说那么多了,我要去买营养快线了。
上述文章如有错误欢迎在留言区指出,如果这篇文章对你有用,点个赞,转个发如何?
- linux epoll 开发指南-【ffrpc源码解析】
- Python之递归函数
- 你不得不会的MarkDown
- 状态机的实现探讨
- Docker入门实战(二)——Docker镜像操作
- 使用强大的 Mockito 来测试你的代码
- java学习手册-CentOS 6.3(x86_32)下安装Oracle 10g R2
- Docker入门实战(三)——用Dockerfile构建镜像
- C++中消息自动派发之二 About IDL解析器
- C++中消息自动派发之三 About JSON Encode
- Linux管道命令
- Linux数据流重定向
- C++中消息自动派发之四 使用IDL构建Chat Server
- Linux Shell(二)——Shell的环境配置
- 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 数组属性和方法