python爬虫抓取图片
一、什么是爬虫
什么是爬虫?爬虫是蜘蛛么?是八爪鱼么?nonono。


爬虫是指请求网站并获取数据的自动化程序,又称网页蜘蛛或网络机器,最常用领域是搜索引擎,最常用的工具是八爪鱼。
它的基本流程分为以下五部分,依次是:
明确需求——发送请求——获取数据——解析数据——存储数据。
爬虫的三大特点:
- 网页都有唯一的URL(统一资源定位符,也就是网址)进行定位
- 网页都使用HTML(定位超文本标记语言)来描述页面信息
- 网页都使用HTTP/HTTPS(超文本传输协议)协议来传输HTML数据
爬虫可以由什么编写呢:
编写爬虫的语言有很多,但用的最多最广的还应该是Python,并且也诞生了很多优秀的库和框架,如scrapy、BeautifulSoup 、pyquery、Mechanize等。但是一般来说,搜索引擎的爬虫对爬虫的效率要求更高,会选用c++、java、go(适合高并发)。
二、爬虫前期准备工作
1、准备一台性能良好的电脑
电脑要求:windows7以上,内存四核8G以上
2、安装python环境
python官网下载地址:
https://www.python.org/downloads/release/python-395/
安装流程:
请自行百度。
3、安装所需要的扩展
咱们主要使用以下四个扩展:
import os # python自带扩展不需要安装
import requests # pip install requests
from urllib import request # python自带扩展不需要安装
from bs4 import BeautifulSoup # 安装命令:pip install bs4
4、查找一个可读取源码的图片网站
注意注意:此链接仅供学习参考,请勿非法批量爬取,任何不听劝阻,一意孤行者,如若产生违法乱纪之事,请自行承担。(开发不易,且行且珍惜) 抓取图片的地址:https://www.umei.cc/meinvtupian/meinvxiezhen/
三、分析网站源码
1、分析源码,得到获取源码的三个方向(编码格式、请求方式、header请求头)
- windows默认是gbk的编码格式,网页一般默认是utf-8的编码,所以直接用windows电脑抓取网页内容信息的时候可能会遇到乱码的问题,所以请求的时候统一编码格式保证数据不乱吗
- 请求方式有post、get、put等方式校验,所以选择对的请求方式获取页面信息,如果不争取可能会出现404找不到页面或者500服务器错误
- header请求头包含很多阴性信息,如果我们常见的,如:反爬机制、token校验、cookie校验等等
2、查找列表页的唯一节点

3、根据图片排版,查找源码规律(相同的li标签获取节点)

4、获取列表的最后一页,获取最后一页的页码(NewPages节点下的尾页,代表最后141页)
根据图片分页的页码地址规律,我们能得到(特别注意:第一页不能使用 index_1.htm 来查询):
https://www.umei.net/meinvtupian/meinvxiezhen/ 第一页没有index
https://www.umei.net/meinvtupian/meinvxiezhen/index_2.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_3.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_4.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_5.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_6.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_7.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_8.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_9.htm
......

5、根据每一个图片链接,进入图片详情
根据上题3可以看出,图片详情的地址为: https://www.umei.net/meinvtupian/meinvxiezhen/233941.htm
6、查找图片详情的地址规律,获取所有的详情子图片地址
根据图片详情可以查看出来每一个子图片的详情地址:
https://www.umei.net/meinvtupian/meinvxiezhen/233941.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_2.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_3.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_4.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_5.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_6.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_7.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_8.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_9.htm

7、根据地址抓取图片流,保留本地
根据题6获取的图片地址进行爬取图片信息,保存到本地,页面分析到此结束,废话不多说,直接上代码,赶紧抓取。
四、开始编写我们的爬虫脚本
1、封装式代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/06/06 14:48
# @Author : Liu
# @Site :
# @File : 美图小姐姐.py
# @Software: PyCharm import requests
import time
import os
import re
from urllib import request
from bs4 import BeautifulSoup url_address = "https://www.umei.cc" def get_url_path(url):
"""
获取地址内容信息
:param url:
:return:
"""
# time.sleep(1) # 获取源码的时候睡眠一秒
obj = requests.get(url)
obj.encoding = obj.apparent_encoding
return obj.text def get_page_info():
"""
抓取每页信息
:return:
"""
nums = int(input("输入抓取的页数:"))
for i in range(nums):
if i < 1:
url = f"{ url_address }/meinvtupian/meinvxiezhen/"
else:
url = f"{ url_address }/meinvtupian/meinvxiezhen/index_{i + 1}.htm"
ret = get_url_path(url) # 获取页面信息
get_bs4(ret) # 逐页抓取页面信息
print(f"第{i+1}页完成")
pass def get_bs4(ret):
soup = BeautifulSoup(ret, "html.parser")
li_list = soup.select(".TypeList")[0].find_all(name="li")
for i in li_list:
# 先获取第一张图片
img_src = url_address + i.a["href"]
ret1 = get_url_path(img_src) # 获取页面信息
get_image_info(ret1, i.a.span.string, 1) # print(ret1) # 获取分页后的页面图片数量
# script_reg = r'<script type="text\/javascript">Next\("\d+","(?P<num>\d+)",.*?\)<\/script>'
script_reg = r'<a href="/meinvtupian/meinvxiezhen/(?P<num>[0-9_]+).htm">尾页</a>'
num_str = re.search(script_reg, ret1, re.S).group("num")
page_num = int(num_str.split("_")[1]) # 获取图片数量 img_lst = os.path.basename(i.a["href"]).split(".") # 获取图片的后缀
img_dir = os.path.dirname(i.a["href"]) # 获取图片的地址路径
for j in range(2, page_num+1):
img_src = f"{ url_address }{img_dir}/{img_lst[0]}_{j}.{img_lst[1]}"
res = get_url_path(img_src) # 获取页面信息
get_image_info(res, i.a.span.string, j) def get_image_info(ret, name, i):
soup = BeautifulSoup(ret, "html.parser")
img = soup.select(".ImageBody img")[0]
image_path = img["src"] # 获取图片地址
image_name = name # 获取图片中文所属
img_name = f"{image_name}_{i}.{os.path.basename(image_path).split('.')[1]}" # 获取图片真实名字
# 图片存储
image_dir = f"girl/{image_name}"
if not os.path.isdir(image_dir):
os.makedirs(image_dir)
# 远程打开图片写入到本地 第一种方式open
# with open(f"{image_dir}/{img_name}", mode="wb") as add:
# add.write(requests.get(image_path).content)
# 远程打开图片写入到本地 第二种方式urllib
request.urlretrieve(image_path, filename=f"{image_dir}/{img_name}") print("已经开始执行了,可能需要等待一会,请您耐心等待!")
begin_time = int(time.time())
get_page_info()
end_time = int(time.time())
print(f"当前脚本执行了{end_time - begin_time}秒")
print("执行已经结束了")
2、简单的爬取首页展示图片代码
import os
import requests
from bs4 import BeautifulSoup
from urllib import request url_address = 'https://www.umei.cc'
list_url = url_address + '/meinvtupian/meinvxiezhen/'
obj = requests.get(list_url)
obj.encoding = obj.apparent_encoding
content = obj.text
# 格式化页面
soup = BeautifulSoup(content, 'html.parser')
li_soup = soup.select(".TypeList")[0].findAll("li")
dir = "./girls/"
for i in li_soup:
if not os.path.isdir(dir):
os.makedirs(dir)
img_path = i.img["src"]
img_suffix = os.path.basename(img_path).split('.')[1]
img_url = dir + i.span.string + '.' + img_suffix
request.urlretrieve(img_path, img_url)
python爬虫抓取图片的更多相关文章
- Python爬虫抓取图片(re模块处理正则表达式)
import os.path import re import requests if __name__ == '__main__': # 如果不存在该文件夹则进行创建 if not os.path. ...
- [python爬虫] 爬取图片无法打开或已损坏的简单探讨
本文主要针对python使用urlretrieve或urlopen下载百度.搜狗.googto(谷歌镜像)等图片时,出现"无法打开图片或已损坏"的问题,作者对它进行简单的探讨.同时 ...
- python爬虫抓网页的总结
python爬虫抓网页的总结 更多 python 爬虫 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自 ...
- python 爬虫抓取心得
quanwei9958 转自 python 爬虫抓取心得分享 urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quo ...
- python爬虫抓站的一些技巧总结
使用python爬虫抓站的一些技巧总结:进阶篇 一.gzip/deflate支持现在的网页普遍支持gzip压缩,这往往可以解决大量传输时间,以VeryCD的主页为例,未压缩版本247K,压缩了以后45 ...
- Python爬虫----抓取豆瓣电影Top250
有了上次利用python爬虫抓取糗事百科的经验,这次自己动手写了个爬虫抓取豆瓣电影Top250的简要信息. 1.观察url 首先观察一下网址的结构 http://movie.douban.com/to ...
- Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储
Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...
- 转载:用python爬虫抓站的一些技巧总结
原文链接:http://www.pythonclub.org/python-network-application/observer-spider 原文的名称虽然用了<用python爬虫抓站的一 ...
- 用python爬虫抓站的一些技巧总结 zz
用python爬虫抓站的一些技巧总结 zz 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本, ...
- python实现简单爬虫抓取图片
最近在学习python,正如大家所知,python在网络爬虫方面有着广泛的应用,下面是一个利用python程序抓取网络图片的简单程序,可以批量下载一个网站更新的图片,其中使用了代理IP的技术. imp ...
随机推荐
- 2022-12-25:etcd可以完全替代zookeeper,原因是k8s用的etcd,不用担心不成熟。请问etcd部署在k3s中,yaml如何写?
2022-12-25:etcd可以完全替代zookeeper,原因是k8s用的etcd,不用担心不成熟.请问etcd部署在k3s中,yaml如何写? 答案2022-12-25: 用户名:root 密码 ...
- 2022-11-24:小团在地图上放了3个定位装置,想依赖他们进行定位! 地图是一个n*n的棋盘, 有3个定位装置(x1,y1),(x2,y2),(x3,y3),每个值均在[1,n]内。 小团在(a,
2022-11-24:小团在地图上放了3个定位装置,想依赖他们进行定位! 地图是一个n*n的棋盘, 有3个定位装置(x1,y1),(x2,y2),(x3,y3),每个值均在[1,n]内. 小团在(a, ...
- 【GiraKoo】could not find UI helper 'git-credential-manager-ui'
环境 Windows 11 git version 2.39.0.windows.1 TortoiseGit 现象 使用TortoiseGit执行git pull命令时,提示could not fin ...
- IDEA output 输出中文乱码解决方案
1. 事发场景 最近在用idea 运行 spring 的项目发现运行之后 tomcat 的 output 输出 中文是乱码样子 2. 解决方法 点击右上角tomcat旁边的小三角 下拉框 点击Edit ...
- python爬虫防止IP被封的一些措施(转)
python爬虫防止IP被封的一些措施(转) 在编写爬虫爬取数据的时候,因为很多网站都有反爬虫措施,所以很容易被封IP,就不能继续爬了.在爬取大数据量的数据时更是瑟瑟发抖,时刻担心着下一秒IP可能就被 ...
- 设置nginx允许服务端跨域
目前项目大多使用前后端分离的模式进行开发,跨域请求当然就是必不可少了,很多时候我们会使用在客户端的ajax 请求中设置跨域请求,也有的在服务端设置跨域.但是有时候会遇到不使用ajax也没有使用后端服务 ...
- 【python基础】input函数
1.初识input函数 大多数程序都旨在解决最终用户的问题,为此通常需要从用户那里获取一些信息.例如假设有人要判断自己是否到了投票的年龄,要编写回答这个问题的程序,就需要知道用户的年龄,这样才能给出答 ...
- WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(6)
WPF入门教程系列目录 WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系 ...
- celery笔记五之消息队列的介绍
本文首发于公众号:Hunter后端 原文链接:celery笔记五之消息队列的介绍 前面我们介绍过 task 的处理方式,将 task 发送到队列 queue,然后 worker 从 queue 中一个 ...
- 大语言模型的开发利器langchain
目录 简介 什么是langchain langchain的安装 langchain快速使用 构建应用 聊天模式 Prompt的模板 Chains Agents Memory 总结 简介 最近随着cha ...