大家好我叫hardy

需求:爬取某个页面,并把该页面的图片下载到本地

思考:

  img标签一个有多少种类型的src值?四种:1、以http开头的网络链接。2、以“//”开头网络地址。3、以“/”开头绝对路径。4、以“./”开头相对路径。当然还有其他类型,不过这个不做考虑,能力有限呀。

  使用什么工具?我用requests、xpth

  都有那些步骤:1、爬取网页

          2、分析html并获取img中的src的值

          3、获取图片

          4、保存

具体实现

import requests
from lxml import etree
import time
import os
import re requests = requests.session() website_url = ''
website_name = '' '''
爬取的页面
'''
def html_url(url):
try:
head = set_headers()
text = requests.get(url,headers=head)
# print(text)
html = etree.HTML(text.text)
img = html.xpath('//img/@src')
# 保存图片
for src in img:
src = auto_completion(src)
file_path = save_image(src)
if file_path == False:
print('请求的图片路径出错,url地址为:%s'%src)
else :
print('保存图片的地址为:%s'%file_path)
except requests.exceptions.ConnectionError as e:
print('网络地址无法访问,请检查')
print(e)
except requests.exceptions.RequestException as e:
print('访问异常:')
print(e) '''
保存图片
'''
def save_image(image_url):
if not image_url:
return False
size =
number =
while size == :
try:
img_file = requests.get(image_url)
except requests.exceptions.RequestException as e:
raise e # 不是图片跳过
if check_image(img_file.headers['Content-Type']):
return False
file_path = image_path(img_file.headers)
# 保存
with open(file_path, 'wb') as f:
f.write(img_file.content)
# 判断是否正确保存图片
size = os.path.getsize(file_path)
if size == :
os.remove(file_path)
# 如果该图片获取超过十次则跳过
number +=
if number >= :
break
return (file_path if (size > ) else False) '''
自动完成url的补充
'''
def auto_completion(url):
global website_name,website_url
#如果是http://或者https://开头直接返回
if re.match('http://|https://',url):
return url
elif re.match('//',url):
if 'https://' in website_name:
return 'https:'+url
elif 'http://' in website_name:
return 'http:' + url
elif re.match('/',url):
return website_name+url
elif re.match('./',url):
return website_url+url[::] '''
图片保存的路径
'''
def image_path(header):
# 文件夹
file_dir = './save_image/'
if not os.path.exists(file_dir):
os.makedirs(file_dir)
# 文件名
file_name = str(time.time())
# 文件后缀
suffix = img_type(header) return file_dir + file_name + suffix '''
获取图片后缀名
'''
def img_type(header):
# 获取文件属性
image_attr = header['Content-Type']
pattern = 'image/([a-zA-Z]+)'
suffix = re.findall(pattern,image_attr,re.IGNORECASE)
if not suffix:
suffix = 'png'
else :
suffix = suffix[]
# 获取后缀
if re.search('jpeg',suffix,re.IGNORECASE):
suffix = 'jpg'
return '.' + suffix # 检查是否为图片类型
def check_image(content_type):
if 'image' in content_type:
return False
else:
return True
#设置头部
def set_headers():
global website_name, website_url
head = {
'Host':website_name.split('//')[],
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
}
return head if __name__ == '__main__': #当前的url,不包含文件名的比如index.html,用来下载当前页的页面图片(./)
website_url = 'https://blog.csdn.net/kindroid/article/details'
#域名,用来下载"/"开头的图片地址
#感兴趣的朋友请帮我完善一下这个自动完成图片url的补充
website_name = 'https://blog.csdn.net'
url = 'https://blog.csdn.net/kindroid/article/details/52095833'
html_url(url)

python 爬虫之requests爬取页面图片的url,并将图片下载到本地的更多相关文章

  1. Python 爬虫入门之爬取妹子图

    Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...

  2. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

  3. Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取

    很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...

  4. Python爬虫实战之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的任意帖子进行抓取 指定是否只抓取楼主发帖 ...

  5. Python爬虫实例:爬取猫眼电影——破解字体反爬

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  6. Python爬虫实例:爬取豆瓣Top250

    入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...

  7. python爬虫-基础入门-爬取整个网站《2》

    python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...

  8. python爬虫-基础入门-爬取整个网站《1》

    python爬虫-基础入门-爬取整个网站<1> 描述: 使用环境:python2.7.15 ,开发工具:pycharm,现爬取一个网站页面(http://www.baidu.com)所有数 ...

  9. Python爬虫教程-17-ajax爬取实例(豆瓣电影)

    Python爬虫教程-17-ajax爬取实例(豆瓣电影) ajax: 简单的说,就是一段js代码,通过这段代码,可以让页面发送异步的请求,或者向服务器发送一个东西,即和服务器进行交互 对于ajax: ...

随机推荐

  1. python 迭代器和生成器的区别

    迭代器(iterator)是一个实现了迭代器协议的对象,python的一些内置数据类型(列表,数组,字符串,字典等)都可以通过for语句进行迭代,我们也可以自己创建一个容器,实现了迭代器协议,可以通过 ...

  2. javascript实现快速排序算法

    忘记了快速排序的思路是怎样的了,复习一下,写了两个实例,发表博文备忘. 对于快速排序的思想,可以参考白话经典算法系列之六 快速排序 快速搞定,讲得比较通俗 prototype扩展的方式 /** * 对 ...

  3. JVM垃圾回收算法图解

    参考文档:https://www.toutiao.com/a6691966641242112516/ 垃圾搜集算法 标记-清除法 标记-清除算法采用从根集合(GC Roots)进行扫描,对存活的对象进 ...

  4. KNN算法项目实战——改进约会网站的配对效果

    KNN项目实战——改进约会网站的配对效果 1.项目背景: 海伦女士一直使用在线约会网站寻找适合自己的约会对象.尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人.经过一番总结,她发现自己交往过的人可 ...

  5. Sql 统计一个表有多少列

    SELECT COUNT(syscolumns.name) FROM syscolumns , sysobjects WHERE syscolumns.id = sysobjects.id AND s ...

  6. 237-基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡

    基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡 一. 板卡概述  本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片, ...

  7. python常用函数 V

    vars(object) 返回对象object的属性和属性值的字典对象.不输入参数,就打印当前调用位置的属性和属性值,相当于locals()的功能. 例子:

  8. Python---基础---str

    #capitalize首字母大写,其余小写,返回字符串 ------------------------------ s = "i LOVE WangXiaoJing"print( ...

  9. c++11 指针空值

    1. 引入nullptr的必要性: 典型的指针初始化是将其指向一个空的位置.比如: int* my_ptr = 0; int* my_ptr = NULL; 一般情况下,NULL是一个宏定义. #un ...

  10. Jesus Is Here

    Jesus Is Here Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)To ...