用requests 模块做了个简单的爬虫小程序,将博客的一篇文章以及图片保存到本地,文章格式存为'.html'。当文章保存到本地后,图片的连接可能是目标站点的绝对或者相对路径,所以要是想在本地也显示图片,需要将保存下来图片的本地路径替换到本地的html文件里。

保存网页用的时requests模块,保存图片用的时BeautifulSoup, 这两个都是第三方模块,需要安装,使用时需要手动导入。

**安装方式:

pip install requsts

在python3 可能用 pip install beautifulsoup 会报错,可以直接pip install bs4, 这样时可以成功安装的。

因为其实beautifulsoup 在bs4安装包中,使用的时候采用:from bs4 import  beautifulsoup

具体的代码如下:

 from bs4 import BeautifulSoup
import requests,os
targetDir = os.path.join(os.path.dirname(os.path.abspath(__file__)),'imgs1')#图片保存的路径,eg,向前文件夹为'D:\Coding', 即图片保存在'D:\Coding\imgs1\'
if not os.path.isdir(targetDir):#不存在创建路径
os.mkdir(targetDir)
url = 'http://www.cnblogs.com/nancyzhu/p/8146408.html'
domain = 'http://www.cnblogs.com'
#保存页面到本地
def save_html():
r_page = requests.get(url)
f = open('page.html','wb')
f.write(r_page.content)#save to page.html
f.close()
return r_page
#修改文件,将图片路径改为本地的路径
def update_file(old,new):
with open('page.html', encoding='utf-8') as f, open('page_bak.html', 'w',
encoding='utf-8') as fw: # 打开两个文件,原始文件用来读,另一个文件将修改的内容写入
for line in f: # 遍历每行,取出来的是字符串,因此可以用replace 方法替换
new_line = line.replace(old, new) # 逐行替换
fw.write(new_line) # 写入新文件
os.remove('page.html') # 删除原始文件
os.rename('page_bak.html', 'page.html') # 修改新文件名, old -> new
#保存图片到本地
def save_file_to_local():
obj = BeautifulSoup(save_html().content, 'lxml') # 后面是指定使用lxml解析,lxml解析速度比较快,容错高。
imgs = obj.find_all('img')
#将页面上图片的链接加入list
urls = []
for img in imgs:
if 'data-src' in str(img):
urls.append(img['data-src'])
else:
urls.append(img['src'])
#遍历所有图片链接,将图片保存到本地指定文件夹,图片名字用0,1,2...
i = 0
for url in urls:#看下文章的图片有哪些格式,一一处理
if url.startswith('//'):
new_url = 'http:' + url
r = requests.get(new_url)
elif url.startswith('/') and url.endswith('gif'):
new_url = domain + url
r = requests.get(new_url)
elif url.endswith('.png') or url.endswith('jpg') or url.endswith('gif'):
r = requests.get(url)
t = os.path.join(targetDir, str(i) + '.jpg')#指定目录
fw = open(t,'wb') # 指定绝对路径
fw.write(r.content)#保存图片到本地指定目录
i += 1
update_file(url,t)#将老的链接(有可能是相对链接)修改为本地的链接,这样本地打开整个html就能访问图片
fw.close() if __name__ == '__main__':
save_html()
save_file_to_local()

python3 用requests 保存网页以及BeautifulSoup保存图片,并且在本地可以正常显示文章的内容和图片的更多相关文章

  1. python3使用requests登录人人影视网站

    python3使用requests登录人人影视网站 继续练习使用requests登录网站,人人影视有一项功能是签到功能,需要每天登录签到才能升级. 下面的代码python代码实现了使用requests ...

  2. python3使用requests发闪存

    闪存ing.cnblogs.com是博客园类似推特.饭否的服务, 我写了以下程序可以完成发闪存的操作,目的是顺便练习使用requests库. requests是一个python 轻量的http客户端库 ...

  3. Python3下requests库发送multipart/form-data类型请求

    [本文出自天外归云的博客园] 要模拟multipart/form-data类型请求,可以用python3的requests库完成.代码示例如下: #请求的接口url url = "url&q ...

  4. 爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,loads,dump,load方法介绍

    爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,load ...

  5. Python3:Requests模块的异常值处理

    Python3:Requests模块的异常值处理 用Python的requests模块进行爬虫时,一个简单高效的模块就是requests模块,利用get()或者post()函数,发送请求. 但是在真正 ...

  6. Python3之Requests模块详解

    # 导入 Request模块 # 若本机无自带Request模块,可自行下载或者使用pip进行安装 # python版本Python3 import requests import json #### ...

  7. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  8. 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容

    一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>和<第14.11节 Python中使用BeautifulSo ...

  9. centos6装python3,并安装requests, lxml和beautifulsoup模块

     一.  安装python3并设为默认版本,与python2共存 1.下载Python3.4安装包 wget https://www.python.org/ftp/python/3.4.4/Pytho ...

随机推荐

  1. Unity四元数和旋转

    四元数介绍 旋转,应该是三种坐标变换——缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转. ...

  2. shrink-to-fit(自适应宽度)

    自适应宽度是指当未明白设定容器的宽度(或外边距设为auto)时,在特定的情况下容器的宽度会依据情况自行设定.而设定的结果往往并非我们想要的. W3C规范中描写叙述了几种shrink-to-fit的情况 ...

  3. ios开发之--系统控件显示中文

    虽然一直知道X-code肯定提供有语言本地化的设置地方,但是一直也做个记录,有些时候的汉化,还是需要使用代码去控制,键盘的右下角.navagiton的return使用代码修改,调用系统相机时,也是出现 ...

  4. ios 的EditBox点击空白处不隐藏的解决方案

    原因:参数少了前缀CC 解决方案:修改 cocos/platform/ios/CCEAGLView-ios.mm 中的 handleTouchesAfterKeyboardShow -(void) h ...

  5. ajax的轮询和长轮询

    概念: 轮询(polling):客户端按规定时间定时像服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 概念总是枯燥的,只有代码方能解心头之快 前段代码:index.html: & ...

  6. 模拟window桌面实现

    正在开发中的游戏有个全屏功能--可以在window桌面背景上运行,就像一些视频播放器在桌面背景上播放一样的,花了个上午整了个Demo放出来留个纪念. 实现功能:显示图标,双击图标执行相应的程序,右击图 ...

  7. CSS解决图片缩小不变形

    我会在图片上加: <img style="max-width:80px;max-height:80px;"> 限制其最大宽度和高度

  8. C语言实现双链表(带头节点)

    双链表和单链表性质相似只是在多加了一个前指针 1.定义结构体 typedef struct Node{ int data; struct Node *prior; struct Node *next; ...

  9. sevlet实现反盗链

    有时候为了网站的版权和安全问题,我们需要为我们的网站应用设置防盗链,这样可以保证我们网站的一些资源的安全性.防盗链的主要是通过获取http的请求头referer的信息来和我们的网站地址做对比,如果相同 ...

  10. linux UIO

    UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍(由www.169it.com搜集整理) UIO(Userspace I/O)是运行在用户空间的I/O技术.Linu ...