python爬取图片
1.导入需要的模块requests,BeautifulSoup,os(用于文件读写)。
2.创建一个类,并初始化。
|
1
2
3
4
5
6
7
8
|
class BeautifulPicture: def __init__(self): # 类的初始化操作 self.headers = { # 给请求指定一个请求头来模拟chrome浏览器 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)' ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} self.web_url = 'url' # 要访问的网页地址 self.folder_path = 'E:\\1\\pic' # 设置图片要存放的文件目录 |
3.先请求图片所在的网页,返回网页response
|
1
2
3
|
def request(self, url): # 返回网页response r = requests.get(url, self.headers) # 向目标url地址发送get请求,返回一个response对象 return r |
调用request方法,print(r.text)就可以看到控制台上print出的网页源码了。
4.通过BeautifulSoup工具获取需要抓取的img标签,这里根据不同的网页布局css选择器也会有不同:
|
1
2
3
4
5
6
|
def get_pic(self): r = self.request(self.web_url) all_item = BeautifulSoup(r.text, 'html.parser').select(".search_results > .item") for item in all_item: img = item.find('a').find('img') url = img['src'] |
此处,我是先抓取img所在的div(类名为item),再获取div下的a链接下的img,网页具体代码格式为
|
1
2
3
4
5
6
7
8
|
<div class="flex_grid credits search_results" style="margin:4px 14px 0 15px"> <div class="item" data-w="640" data-h="256"> <a href=""> <img srcset="" src="" alt=""> </a> </div> ......</div> |
通过遍历可以获取所有图片的链接。
5.获取到图片地址链接后,就可以下载图片并保存到本地了。那么就需要确认初始化定义的文件夹是否存在,如果不存在,需要创建。
|
1
2
3
4
5
6
7
8
9
|
def mkdir(self, path): # 创建文件夹 path = path.strip() is_exists = os.path.exists(path) if not is_exists: print('创建名字叫做', path, '的文件夹') os.makedirs(path) print('创建成功!') else: print(path, '文件夹已经存在了,不再创建') |
6.接下来就可以保存图片了。
第四步操作,在get_pic方法中,获取到所有图片所在的div标签后,先确保存放图片的文件下是否存在,调用方法
self.mkdir(self.folder_path) # 创建文件夹
os.chdir(self.folder_path) # 切换路径至上面创建的文件夹
遍历所有的div,根据url名中jpg/png的不同,决定保存图片的后缀名
|
1
2
3
4
5
6
7
8
9
|
i = 1 # 后面用来给图片命名for item in all_item: img = item.find('a').find('img') url = img['src'] if url.count('jpg') > 0: self.save_img(url, str(i) + '.jpg') elif url.count('png') > 0: self.save_img(url, str(i) + '.png') i += 1 |
其中save_img方法为:
|
1
2
3
4
5
6
|
def save_img(self, url, name): # 保存图片 img = self.request(url) f = open(name, 'ab') f.write(img.content) print(name, '文件保存成功!') f.close() |
创建MyBeautifulPicture类的实例,调用get_pic方法,至此,保存图片到本地就可以实现了。
完整的get_pic方法为:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def get_pic(self): r = self.request(self.web_url) all_item = BeautifulSoup(r.text, 'html.parser').select(".search_results > .item") self.mkdir(self.folder_path) # 创建文件夹 os.chdir(self.folder_path) # 切换路径至上面创建的文件夹 i = 1 # 后面用来给图片命名 for item in all_item: img = item.find('a').find('img') url = img['src'] # print(url) if url.count('jpg') > 0: self.save_img(url, str(i) + '.jpg') elif url.count('png') > 0: self.save_img(url, str(i) + '.png') i += 1 |
python爬取图片的更多相关文章
- python 爬取图片
使用python的requests库爬取网页时,获取文本一般使用text方法,如果要获取图片并保存要用content 举个栗子,爬煎蛋网的图: #!/usr/bin/env python #-*- c ...
- Python爬去图片实例,python 爬取图片
# coding:utf-8 import requests import re import time proxies = { "http": "http://124. ...
- 20170912多线程Python爬取图片
import threading #导入线程 from urllib import request #导入网页请求模块 import re #导入正则表达式模块 import os # 引入模块 fr ...
- python如何使用request爬取图片
下面是代码的简单实现,变量名和方法都是跑起来就行,没有整理,有需要的可以自己整理下: image2local: import requests import time from lxml import ...
- [python爬虫] 爬取图片无法打开或已损坏的简单探讨
本文主要针对python使用urlretrieve或urlopen下载百度.搜狗.googto(谷歌镜像)等图片时,出现"无法打开图片或已损坏"的问题,作者对它进行简单的探讨.同时 ...
- 孤荷凌寒自学python第八十二天学习爬取图片2
孤荷凌寒自学python第八十二天学习爬取图片2 (完整学习过程屏幕记录视频地址在文末) 今天在昨天基本尝试成功的基础上,继续完善了文字和图片的同时爬取并存放在word文档中. 一.我准备爬取一个有文 ...
- 孤荷凌寒自学python第八十一天学习爬取图片1
孤荷凌寒自学python第八十一天学习爬取图片1 (完整学习过程屏幕记录视频地址在文末) 通过前面十天的学习,我已经基本了解了通过requests模块来与网站服务器进行交互的方法,也知道了Beauti ...
- python +requests 爬虫-爬取图片并进行下载到本地
因为写12306抢票脚本需要用到爬虫技术下载验证码并进行定位点击所以这章主要讲解,爬虫,从网页上爬取图片并进行下载到本地 爬虫实现方式: 1.首先选取你需要的抓取的URL:2.将这些URL放入待抓 ...
- python网络爬虫之使用scrapy爬取图片
在前面的章节中都介绍了scrapy如何爬取网页数据,今天介绍下如何爬取图片. 下载图片需要用到ImagesPipeline这个类,首先介绍下工作流程: 1 首先需要在一个爬虫中,获取到图片的url并存 ...
随机推荐
- 在C#中将对象序列化成Json格式
在C#中将对象转换为Json格式的字符串. //匿名对象 var dataObj = new { Number = 1, Name = "Json" }; //将返回的时间格式解析 ...
- Django项目BBS博客论坛
BBS 项目开发逻辑梳理 第一步:先进行数据库设计 数据库设计规则是: 1.先创建基表:用户表.站点表.文章表.标签表.分类表.文章2标签第三张关系表.点赞点踩表.评论表 2.书写表中的基本含有的字段 ...
- Linux下如何编辑pdf文件目录
目前,我使用的是系统LinuxMint,之前硬盘没坏时都是用Foxit Reader和Okular查看pdf文件,可是后来发现Foxit Reader十分吃CPU,而且现在换了固态硬盘之后只有120G ...
- C# MD5加密字符串
/// <summary> /// 用MD5加密字符串,可选择生成16位或者32位的加密字符串 /// </summary> /// <param name=" ...
- 对JDK动态代理的模拟实现
对JDK动态代理的模拟 动态代理在JDK中的实现: IProducer proxyProduec = (IProducer)Proxy.newProxyInstance(producer.getCla ...
- i2c_msg 标志位 - repeat-start
i2c_msg标志位 路径:linux-2.6.38/include/linux/i2c.h I2C_M_IGNORE_NAK: 设置这个标志意味当前i2c_msg忽略I2C器件的ack和n ...
- Matlab非线性规划
非线性规划 在matlab非线性规划数学模型可以写成一下形式: \[ minf(x)\\ s.t.\begin{cases} Ax \le B \\ Aeq·x = Beq\\ C(x) \le 0\ ...
- 2018 经典的CVPR 关于ImageCaptioning论文
1. SemStyle: Learning to Generate Stylised Image Captions using Unaligned Text(2018 CVPR) 主要研 ...
- python函数中参数的传递
Python唯一支持的参数传递方式是『共享传参』(call by sharing)多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本类型按值传递 ...
- 从. NET 和 Java 之争谈 IT 这个行业
一.有些事情难以回头 开篇我得表名自己的立场:.NET JAVA 同时使用者, 但更加偏爱. NET. 原因很简单 NET 语言更具开放性, 从开源协议和规范可以看出; 语言更具优势严谨; 开发工具 ...