基于Python下载网络图片方法汇总代码实例 用python批量下载网络图片

时间:2021-07-15 23:03:44作者:翁轶平

本内容主要为您介绍基于Python下载网络图片方法汇总代码实例的经验知识,经过上千万码农友验证可行,为您解决基于Python下载网络图片方法汇总代码实例的问题,下面即将揭晓答案。

在实际操作中,图片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)

    
相关文章
  • python下载文件时显示下载进度的方法

    本文实例讲述了python下载文件时显示下载进度的方法。分享给大家供大家参考。具体分析如下: 将这段代码放入你的脚本中,类似:urllib.urlretrieve(getFile, saveFile, reporthook=report) 第三个参数如下面的函数定义report,urlretrieve下载文件时会实时回调report函数,显示下载进度 def report(count, blockSize, totalSize): percent = int(count*blockSize*100/totalSize) s

  • Python下载懒人图库JavaScript特效

    这是一个简单的Python脚本,主要从懒人图库下载JavaScript特效模板,在脚本中使用了gevent这个第三方库,使用的时候需要先安装。 #!/usr/bin/python # -*- coding: utf-8 -*- import urllib,os,sys import gevent,re from gevent import monkey from bs4 import BeautifulSoup gevent.monkey.patch_socket() Description:Python 爬虫抓取懒人图库的JS脚本模板 Auth

  • 使用Python下载歌词并嵌入歌曲文件中的实现代码 python如何导入音乐

    使用python扫描本地音乐并下载歌词 这次这个真的是干货哦,昨晚弄了半晚上,,,,从8点吃完饭就开始写,一直到了快12点才弄好,,,新手,伤不起呀。。。。 先简单的说下吧,百度提供了一个音乐搜索的api,你想百度请求类似于 http://box.zhangmen.baidu.com/x op=12 count=1 title=最佳损友$$陈奕迅$$$$ 的地址,百度会给你返回一段xml,如下所示 This XML file does not appear to have any style i

  • Python下载指定页面上图片的方法 python载入图片

    Python下载指定页面上图片的方法  更新时间:2016年05月12日 09:12:12   作者:charles_kao   这篇文章主要介绍了Python下载指定页面上图片的方法,涉及Python的正则匹配、URL及文件操作相关技巧,需要的朋友可以参考下

  • python下载图片实现方法(超简单) 用python做一张图片

    我们有时候会需要在网上查找并下载图片,当数量比较少的时候,点击右键保存,很轻松就可以实现图片的下载,但是有些图片进行了特殊设置,点击右键没有显示保存选项,或者需要下载很多图片,这样的情况,写一段Python爬虫代码就可以轻松解决! 一、页面抓取 #coding=utf-8 import urllib def getHtml(url): page = urllib.urlopen(url) html = page.read() return html html = getHtml("https://tieba.baidu.

  • python下载文件记录黑名单的实现代码

    ftp_path = '/GBCC/' # ftp目录 local_path = "C:\F\python\pythonwangtest\wyjj2\\" #本地的目录 # 连接FTP def ftpconnect(): ftp = FTP() ftp.set_debuglevel(2) # 打开调试级别2,显示详细信息 ftp.connect(ftp_server, 21) # 连接 ftp.login(username, password) # 登录,如果匿名登录则用空串代替即可 return ftp # 获取当前的年月日时分秒 def g

  • Python下载网络小说实例代码 python爬小说代码

    #处理的字符的确是gbk的,但是其中夹杂的部分特殊字符, #是gbk编码中所没有的如果有些特殊字符是GB18030中有的,但是是gbk中没有的。 #则用gbk去解码,去所不支持的字符,也比如会出错。 #所以,此种情况,可以尝试用和当前编码(gbk)所兼容的但所包含字符更多的编码(gb18030)去解码,或许就可以了。 #allHtml = resp.read().decode('gbk')# allHtml = resp.read().decode('gb18030')# textSoup = BeautifulSoup(allHtml) #章节名 s

  • Python下载网络文本数据到本地内存的四种实现方法示例

    本文实例讲述了Python下载网络文本数据到本地内存的四种实现方法。分享给大家供大家参考,具体如下: import urllib.request import requests from io import StringIO import numpy as np import pandas as pd 下载网络文件,并导入CSV文件作为numpy的矩阵 # 网络数据文件地址 url = "http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/p

  • python下载微信公众号相关文章 微信软件下载公众号

    本文实例为大家分享了python下载微信公众号相关文章的具体代码,供大家参考,具体内容如下 目的:从零开始学自动化测试公众号中下载“pytest"一系列文档 1、搜索微信号文章关键字搜索 2、对搜索结果前N页进行解析,获取文章标题和对应URL 主要使用的是requests和bs4中的Beautifulsoup Weixin.py import requests from urllib.parse import quote from bs4 import BeautifulSou

  • 详解Python下载图片并保存本地的两种方式 python怎么把图片保存在文件夹

    一:使用Python中的urllib类中的urlretrieve()函数,直接从网上下载资源到本地,具体代码: import os,stat import urllib.request img_url="https://timgsa.baidu.com/timg image quality=80 size=b9999_10000 sec=1516371301 di=d99af0828bb301fea27c2149a7070" \ "d44 imgtype=jpg er=1 src=http%3A%2F%2Fupload.qianhuaweb.co