本文介绍下载python下载网络图片的方法,包括通过图片url直接下载、通过re/beautifulSoup解析html下载以及对动态网页的处理等。

​很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789

通过pic_url单个/批量下载

已知图片url,例如http://xyz.com/series-*(1,2..N).jpg,共N张图片,其链接形式较为固定,这样经简单循环,直接通过`f.write(requests.get(url).content)'即可以二进制形式将图片写入。

import os
import requestsdef download(file_path, picture_url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36            (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE",}r = requests.get(picture_url, headers=headers)with open(file_path, 'wb') as f:f.write(r.content)def main():os.makedirs('./pic/', exist_ok=True)  # 输出目录prefix_url = 'http://xyz.com/series-'  # 同一类目下的图片url前缀n = 6  # 该类目下的图片总数tmp = prefix_url.split('/')[-1]for i in range(1, n + 1):file_path = './pic/' + tmp + str(i) + '.jpg'picture_url = prefix_url + str(i) + '.jpg'download(file_path, picture_url)if __name__ == '__main__':main()
复制代码

正则re解析html获取pic_url后下载

在实际操作中,图片url按序排列情况较少,多数情况下用户仅知道网页url,需要对当前网页htnl内容进行解析,获取源码中包含的图片url,常用方法有正则表达式匹配或BeautifulSoup等库解析的方法。

正则re解析的思路是:首先通过 requests.get(url).text 获得当前页面html源码;然后通过正则表达式匹配图片url,如 re.compile(r'[a-zA-z]+://[^\s]*\.jpg') 正则式一般会得到.jpg结尾的url,但其他网站图片url可能会以.png或.webp等结尾,甚至需要其他的正则匹配,为此,读者需要对正则表达式有所了解,强烈推荐 正则表达式30分钟入门教程 ;将前一步得到的图片url加入列表,进行下载。

import os
import re
import requestsdef get_html(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36 ",}html = requests.get(url, headers=headers).textreturn htmldef parse_html(html_text):picre = re.compile(r'[a-zA-z]+://[^\s]*\.jpg')  # 本正则式得到.jpg结尾的urlpic_list = re.findall(picre, html_text)return pic_listdef download(file_path, pic_url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36 ",}r = requests.get(pic_url, headers=headers)with open(file_path, 'wb') as f:f.write(r.content)def main():# 使用时修改url即可url = 'http://xyz.com/series'html_text = get_html(url)pic_list = parse_html(html_text)os.makedirs('./pic/', exist_ok=True)  # 输出目录for pic_url in pic_list:file_name = pic_url.split('/')[-1]file_path = './pic/' + file_namedownload(file_path, pic_url)if __name__ == '__main__':main()
复制代码

通过bs4获取pic_url

与正则匹配思路类似,只不过通过Beautiful Soup解析html获得图片url列表,然后依次下载图片。由于各网站html结构有差异,用户需要自行进行适当修改。以下代码是对豆瓣图片的下载。

import os
import time
import requests
from bs4 import BeautifulSoupdef get_html(url):headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36            (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',}html = requests.get(url, headers=headers).textreturn htmldef parse_html(html_text):soup = BeautifulSoup(html_text, 'html.parser')li = soup.find_all('div', attrs={'class':'cover'})pic_list = []for link in li:pic_url = link.find('img').get('src')pic_url = pic_url.replace('/m/', '/l/')pic_list.append(pic_url)return pic_listdef download(file_path, pic_url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36 ",}r = requests.get(pic_url, headers=headers)with open(file_path, 'wb') as f:f.write(r.content)def main():'从豆瓣下载石原里美图片,观察发现每页包含30张图片,其url按30递增,如下所示'pic_list = []for i in range(10):url = 'https://movie.douban.com/celebrity/1016930/photos/?type=C&start=' + str(30*i) + '&sortby=like&size=a&subtype=a'html_text = get_html(url)pic_list += parse_html(html_text)os.makedirs('./pic/', exist_ok=True)  # 输出目录for i, pic_url in enumerate(pic_list):if i%30 == 0:print('正在下载第%s页'%(i/30+1))file_name = pic_url.split('/')[-1].split('.')[0] + '.jpg'file_path = './pic/' + file_namedownload(file_path, pic_url)if __name__ == '__main__':main()
复制代码

在下载图片时,发现可以直接访问图片的缩略图url进行下载,但由于豆瓣的反爬策略,直接访问原图url会被服务器拒绝,见下图。解决方法见下一部分。

可能遇到的问题

  • 网站反爬虫机制

    1. User-Agent:模拟浏览器访问,添加后,服务器会认为是浏览器正常的请求。一般与网页操作相关访问都予以添加。
    2. Referer:浏览器以此来判断你从哪一个网页跳转过来。例如在上述豆瓣图片的下载示例中,直接输入网址会被拒绝,但你在网站一步步点击却会在同一地址中得到内容,这就是因为你在一步步访问时是有一个前序跳转地址的,这个地址可以通过“F12”在header中得到,如果找不到的话试一试根目录地址“ movie.douban.com/”,或是前几步的地址”… GitHub仓库’adv_bs4_url.py‘文件 。
    3. ip伪装:构建ip池。
    4. Cookie伪装:cookie是服务器用来辨别你此时的状态的,每一次向服务器请求cookie都会随之更新。
  • 常用正则式匹配

    • 强烈推荐 正则表达式30分钟入门教程
  • 网页的数据采用异步加载,如js渲染的页面或ajax加载的数据通过get不到完整页面源码。

    • 一种方案是常说的动态爬虫,即采用一些第三方的工具,模拟浏览器的行为加载数据,如Selenium、PhantomJs等。网络上有较多介绍文章,有点麻烦就没有自己写了,后续有需求的话在做吧,不过其他方法已经够用了。

    • 另外可以通过分析页面,找到请求借口,加载页面。其核心就是跟踪页面的交互行为 JS 触发调度,分析出有价值、有意义的核心调用(一般都是通过 JS 发起一个 HTTP 请求),然后我们使用 Python 直接访问逆向到的链接获取价值数据。通过"F12”进行分析,例如对于花瓣网,可以获得其链接为" huaban.com/search/?q=石… request.urlopen(url).read() 读取网页。

  • 其他问题...

Pyautogui,鼠标模拟点击的“傻瓜式”流程

本方法仅适用于重复性的工作,而且效率较低,但完全没有被反爬虫策略屏蔽的风险。其核心思想与word中的“宏”类似,就是你告诉计算机一次循环中鼠标分别如何操作,然后让其自动循环。代码简单明了。

import pyautogui
import timepyautogui.FAILSAFE = Truedef get_mouse_positon():time.sleep(3)  # 此间将鼠标移动到初始位置x1, y1 = pyautogui.position()print(x1, y1)pyautogui.click(x=x1, y=y1, button='right')  # 模拟鼠标右键点击,呼出菜单time.sleep(5)  # 此间将鼠标移动到“save image as...”选项中央x2, y2 = pyautogui.position()print(x2, y2)pyautogui.click(x=x2, y=y2)  # 模拟鼠标左键点击,点中“save image as...”time.sleep(10)  # 此间弹出保存文件弹窗,自行选择保存位置,并将鼠标移至“保存(S)”按钮中央x3, y3 = pyautogui.position()pyautogui.click(x=x3, y=y3)print(x3, y3)def click_download(N):for i in range(N):  # 拟下载图片数量pyautogui.click(x=517, y=557, duration=0.25, button='right')  # 呼出菜单,自行将x/y设置为x1/y1time.sleep(1)pyautogui.click(x=664, y=773, duration=0.25)  # 下载,x/y为x2/y2time.sleep(1)pyautogui.click(x=745, y=559, duration=0.25)  # 保存,x/y为x3/y3time.sleep(1)pyautogui.click(x=517, y=557, duration=0.25)  # 进入下一张图片time.sleep(2) # 取决于网络加载速度,自行设置if __name__ == "__main__":# get_mouse_positon()  # 一开始只运行此命令,获取屏幕坐标,后续注释掉该句click_download(10)
复制代码

Python下载网络图片方法汇总与实现相关推荐

  1. python3下载文件-python3 下载文件方法汇总

    学习python爬虫中,特地mark,以备忘 方法一: 使用 urllib 模块提供的 urlretrieve() 函数.urlretrieve() 方法直接将远程数据下载到本地. urlretrie ...

  2. python xlsxwriter使用方法汇总

    xlsxwriter用来写入excel的模块 1.创建一个excel文件 import xlsxwriter filename = '/Users/piperck/Desktop/demo.xlsx' ...

  3. Python按键检测方法汇总

    文章目录 signal信号量, pynput termios, signal tty, termios pygame opencv 通过实测,主要有以下方案,点击查看具体实现细节 signal信号量, ...

  4. 用 Python 压缩文件方法汇总

    Python 提供了几乎为所有现有压缩文件的工具,下面逐一领略. zlib 是一个 Python 库,能够实现 zip .gzip 格式文件的压缩和解压缩. bz2 模块提供了对 bzip2 格式的压 ...

  5. Python下载视频方法(不懂python 也可以用此方法)

    首先下载Python 软件, 下载地址:https://www.python.org/downloads/release/python-388/ 安装64 位python : 打开安装包递归式点击下一 ...

  6. python取整方法汇总

    1.向下取整 a=math.floor(3.75)#向下取整 print(a) a=int(0.75)#向0取整 print(a) #或者 a=5\\2#取整时保留整数的下界 print(a) 结果: ...

  7. python官网怎么下载-python下载官网

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 1.下载pythonpython下载步骤:(1). 进入python下载官网:ht ...

  8. python下载官网-python下载官网

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 1.下载pythonpython下载步骤:(1). 进入python下载 ...

  9. python下载地址-python下载网址

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. python下载windows下载windows下载页面https:ww ...

最新文章

  1. Java 编程技巧之数据结构
  2. python c#_【分享】C# 调用 Python 脚本, 与 Python 调用 C# 类库
  3. python画二维散点图-python3怎样画二维点图
  4. 基于反射机制的服务代理调用
  5. .NET分布式大规模计算利器-Orleans(一)
  6. centos下搭建Jenkins持续集成环境(安装jenkins)
  7. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第52篇]选择一个先进的应用概念,如电子投票、拍卖或多方计算。这种系统的大致安全要求是什么?
  8. springboot设置运行内存_Docker 如何运行多个 Springboot?
  9. 海外新趋势:挑战Tiktok,跨境卖家的新红利流量渠道?
  10. Ubuntu Mysql安装配置
  11. 数据结构(三):非线性逻辑结构-树
  12. web前端开发技术的优化策略
  13. 国内博客搬家工具大全
  14. qpsk相点 matlab,qpsk调制解调matlab仿真程序详解
  15. 读《大学之路》有感---谈谈书房对于一个家庭的重要性
  16. 【折腾向】手动更换笔记本散热铜管
  17. 图像处理:RGB565转RGB888
  18. 使用OpenSSL模拟SSL证书验证过程
  19. 如何在windows下运用dd来下修复坏块?
  20. 毁掉一个孩子只要十步(80%的家长都在做)

热门文章

  1. javascript-数据类型的转换
  2. django 视图-----视图函数
  3. 水平分库分表的关键问题及解决思路(转)
  4. 分公司部署加速设备实现广域网加速
  5. Atitit .h5文件上传 v3
  6. Java开发常用工具类
  7. 如何word删除分隔符
  8. 变形金刚热映黑客借机“下毒” 用户谨防木马
  9. Nginx 极简入门教程
  10. Redis面试 - 集群模式