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

通过pic_url单个/批量下载

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

import os

import requests

def 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 requests

def 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).text

return html

def parse_html(html_text):

picre = re.compile(r'[a-zA-z]+://[^\s]*\.jpg') # 本正则式得到.jpg结尾的url

pic_list = re.findall(picre, html_text)

return pic_list

def 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_name

download(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 BeautifulSoup

def 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).text

return html

def 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_list

def 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_name

download(file_path, pic_url)

if __name__ == '__main__':

main()

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

可能遇到的问题

网站反爬虫机制

User-Agent:模拟浏览器访问,添加后,服务器会认为是浏览器正常的请求。一般与网页操作相关访问都予以添加。

Referer:浏览器以此来判断你从哪一个网页跳转过来。例如在上述豆瓣图片的下载示例中,直接输入网址会被拒绝,但你在网站一步步点击却会在同一地址中得到内容,这就是因为你在一步步访问时是有一个前序跳转地址的,这个地址可以通过“F12”在header中得到,如果找不到的话试一试根目录地址“ movie.douban.com/”,或是前几步的地址”… GitHub仓库'adv_bs4_url.py‘文件 。

ip伪装:构建ip池。

Cookie伪装:cookie是服务器用来辨别你此时的状态的,每一次向服务器请求cookie都会随之更新。

常用正则式匹配

网页的数据采用异步加载,如js渲染的页面或ajax加载的数据通过get不到完整页面源码。

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

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

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

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

import pyautogui

import time

pyautogui.FAILSAFE = True

def 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/y1

time.sleep(1)

pyautogui.click(x=664, y=773, duration=0.25) # 下载,x/y为x2/y2

time.sleep(1)

pyautogui.click(x=745, y=559, duration=0.25) # 保存,x/y为x3/y3

time.sleep(1)

pyautogui.click(x=517, y=557, duration=0.25) # 进入下一张图片

time.sleep(2) # 取决于网络加载速度,自行设置

if __name__ == "__main__":

# get_mouse_positon() # 一开始只运行此命令,获取屏幕坐标,后续注释掉该句

click_download(10)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python下载图片代码_基于Python下载网络图片方法汇总代码实例相关推荐

  1. python短信接口_基于 python 的短信接口调用代码示例模板

    阅信短信验证码平台最近会从新梳理基于不同语言的短信接口调用代码示例,是为了迎合市面上现在流行的各个语言代码实现,也是为了能够更好的服务满足客户的不同层次的需求. 下面的代码是基于 python 的短信 ...

  2. python制作图片墙_利用python生成照片墙的示例代码

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...

  3. python画素描画_基于python实现把图片转换成素描

    这篇文章主要介绍了基于python实现把图片转换成素描,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 导语: 你是否还在为当时年少时没有选择自己的梦 ...

  4. python点名代码_基于python tkinter的点名小程序功能的实例代码

    基于python tkinter的点名小程序功能的实例代码,花名册,次数,窗口,未找到,初始化 基于python tkinter的点名小程序功能的实例代码 易采站长站,站长之家为您整理了基于pytho ...

  5. python的坐标代码_基于Python的地图坐标服务接口调用代码实例

    代码描述:基于Python的地图坐标服务接口调用代码实例 关联数据:地图坐标服务 接口地址:http://www.juhe.cn/docs/api/id/32 #!/usr/bin/python # ...

  6. python开发语音录入_基于python实现语音录入识别代码实例

    这篇文章主要介绍了如何通过python实现语音录入识别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.介绍 1.第一步录音存入本地 2.调用百度 ...

  7. python制作图片数据集 h5py_基于h5py的使用及数据封装代码

    1. h5py简单介绍 h5py文件是存放两类对象的容器,数据集(dataset)和组(group),dataset类似数组类的数据集合,和numpy的数组差不多.group是像文件夹一样的容器,它好 ...

  8. 随机数写excel java代码_基于python实现在excel中读取与生成随机数写入excel中

    搜索热词 具体要求是:在一份已知的excel表格中读取学生的学号与姓名,再将这些数据放到新的excel表中的第一列与第二列,最后再生成随机数作为学生的考试成绩. 首先要用到的数据库有:xlwt,xlr ...

  9. python三维重建代码_基于Python的三维重建开源代码

    [实例简介] 基于Python的三维重建开源代码,包括特征提取,SFM,PMVS以及CMVS等相关功能! [实例截图] [核心代码] sfm-bundler(python) └── sfm-bundl ...

  10. python地铁查询系统_基于Python的苏州实时公交/地铁接口调用代码实例

    1.[代码][Python]代码 #!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib from urllib import ur ...

最新文章

  1. (转载)(官方)UE4--图像编程----Parallel Rendering Overview
  2. think in java i o_5.[Think in Java笔记]Java IO系统
  3. linux接收手机信号,接收关联设备的信号强度在Linux接入点
  4. VTK:几何对象之ParametricSuperToroid
  5. C# 2.0 锐利体验
  6. Java-Exception异常
  7. Google Docs API 发布,自动化文档处理
  8. 水晶报表中的主从表结构
  9. 用HTML5为你的网页添加音效(兼容Firefox 3.5+, IE 6-9, Safari 3.0+, Chrome 3.0+, Opera 10.5+)
  10. LeetCode通关:连刷三十九道二叉树,刷疯了!⭐四万字长文搞定二叉树,建议收藏!⭐
  11. php获取验证码倒数60秒,yii框架实现注册页面短信验证60秒倒计时
  12. Apache opennlp简单介绍
  13. 记工作的第一月--光说不练,假把式
  14. Golang-常用第三方库
  15. 语音增强 理论与实践 pdf_初中英语语音教学策略研究 (结题报告)
  16. 遥控小车(基于TCP/IP)
  17. 使用C#进行蓝牙开发-接收BLE广播
  18. 【贪心法】基站布置问题
  19. 虚拟机(Please umount the filesystem and rectify the problem(s))记录
  20. 身份证号码有效性检测

热门文章

  1. 京东后台:订单履约系统设计(下)
  2. 美团 O2O 供应链系统架构设计解析
  3. cad怎么把图层英文变成中文_cad图层英文
  4. JS调用google DEMO朗读
  5. 在 PyCharm 中使用 PyInstaller 打包 EXE 之过程简记
  6. 移动硬盘格式化了,要怎么恢复数据
  7. java用户登录进入系统_Java CRM系统用户登录功能实现代码实例
  8. c语言写的电脑开关机代码,只需要几行代码制作电脑开关机控制软件
  9. 优酷发布2018世界杯战略 视频云将提供全程技术保障
  10. Tungsten Fabric解决方案指南-Kubernetes集成