本文介绍下载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 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会被服务器拒绝,见下图。解决方法见下一部分。

可能遇到的问题

  • 网站反爬虫机制

    1. User-Agent:模拟浏览器访问,添加后,服务器会认为是浏览器正常的请求。一般与网页操作相关访问都予以添加。
    2. Referer:浏览器以此来判断你从哪一个网页跳转过来。例如在上述豆瓣图片的下载示例中,直接输入网址会被拒绝,但你在网站一步步点击却会在同一地址中得到内容,这就是因为你在一步步访问时是有一个前序跳转地址的,这个地址可以通过“F12”在header中得到,如果找不到的话试一试根目录地址“ movie.douban.com/”,或是前几步的地址”… GitHub仓库’adv_bs4_url.py‘文件 。
    3. ip伪装:构建ip池。
    4. 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下载网络图片方法汇总与实现的更多相关文章

  1. Python字符串解析方法汇总

    Python字符串方法解析 1.capitalize 将首字母大写,其余的变成小写 print('text'.capitalize()) print('tExt'.capitalize()) 结果: ...

  2. python安装模块方法汇总

    方法一: 原文地址: http://blog.csdn.net/cighao/article/details/47860041 在 windows 系统下,只需要输入命令 pip install re ...

  3. python拼接字符串方法汇总

    python拼接字符串一般有以下几种方法: 1.直接通过(+)操作符拼接 s = 'Hello'+' '+'World'+'!' print(s) 输出结果:Hello World! 这种方式最常用. ...

  4. net下载文件方法汇总

    //TransmitFile实现下载 protected void Button1_Click1(object sender, EventArgs e) { /* 微软为Response对象提供了一个 ...

  5. python list遍历方法汇总

    list=['a','b','c','d','e'] #方法1: print('#方法1:') #i值为列表的item,list为列表名,因此i值即为列表元素 for i in list: #list ...

  6. Python列表排序方法汇总,超详细!

    1. 修改原列表,不创建新列表的排序 1 a = [3, 2, 8, 4, 6] 2 print(id(a)) # 2180873605704 3 a.sort() # 默认升序 4 print(a) ...

  7. Python下载网页的几种方法

    get和post方式总结 get方式:以URL字串本身传递数据参数,在服务器端可以从'QUERY_STRING'这个变量中直接读取,效率较高,但缺乏安全性,也无法来处理复杂的数据(只能是字符串,比如在 ...

  8. python文本 单独处理每个字符的方法汇总

    python文本 单独处理字符串每个字符的方法汇总 场景: 用每次处理一个字符的方式处理字符串 方法: 1.使用list(str) >>> a='abcdefg'    >&g ...

  9. 编程中遇到的Python错误和解决方法汇总整理

    这篇文章主要介绍了自己编程中遇到的Python错误和解决方法汇总整理,本文收集整理了较多的案例,需要的朋友可以参考下   开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析, ...

随机推荐

  1. A Great Alchemist 最详细的解题报告

    题目来源:A Great Alchemist A Great Alchemist Time limit : 2sec / Stack limit : 256MB / Memory limit : 25 ...

  2. three.js 几何体(三)

    上一篇介绍了几何体的构造体参数,这篇郭先生就接着上一篇说. 1. ExtrudeGeometry挤压几何体 挤压几何体允许我们从一条形状路径中,挤压出一个Geometry.ExtrudeGeometr ...

  3. [Cordova]Cordova6.x自定义插件之Andorid

    1.继承了CordovaPlugin的Java Class 需要重写execute方法,如下: 2.在res/xml/config.xml中关联上述java class 3.在assets/www/p ...

  4. 动手实现 LRU 算法,以及 Caffeine 和 Redis 中的缓存淘汰策略

    我是风筝,公众号「古时的风筝」. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 那天我在 LeetCode 上刷到一道 LRU 缓存机制的问题, ...

  5. Python3 迭代器深入解析

    第6章 函数 6.1 函数的定义和调用 6.2 参数传递 6.3 函数返回值 6.4 变量作用域 6.5 匿名函数(lambda) 6.6 递归函数 6.7 迭代器 6.8 生成器 6.9 装饰器 6 ...

  6. Ethical Hacking - GAINING ACCESS(1)

    Gaining Access Introduction Everything is a computer Two main approaches (1)Server Side Do not requi ...

  7. P5198 [USACO19JAN]Icy Perimeter S (洛谷) (水搜索)

    同样是因为洛谷作业不会写…… 写(水)博客啦. 直接放题目吧,感觉放在代码框里好看点 Farmer John要开始他的冰激凌生意了!他制造了一台可以生产冰激凌球的机器,然而不幸的是形状不太规则,所以他 ...

  8. 设计模式:strategy模式

    思想:将算法进行抽象,然后使用桥接的模式使用算法的抽象接口,达到算法整体替换的目的 理解:和桥接模式相同,只是桥接的两边分开的思想不同 例子: class Algrithm //算法的抽象 { pub ...

  9. 深入掌握K8S Pod

    k8s系列文章: 什么是K8S K8S configmap介绍 Pod是k8s中最小的调度单元,包含了一个"根容器"和其它用户业务容器. 如果你使用过k8s的话,当然会了解pod的 ...

  10. 题解 洛谷 P4336 【[SHOI2016]黑暗前的幻想乡】

    生成树计数的问题用矩阵树定理解决. 考虑如何解决去重的问题,也就是如何保证每个公司都修建一条道路. 用容斥来解决,为方便起见,我处理时先将\(n\)减了1. 设\(f(n)\)为用\(n\)个公司,且 ...