用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. media wiki run on nginx

    1. 环境安装: nginx安装 nginx-1.5.7 php安装 PHP 5.4.10 (cli) (built: Jul 30 2014 16:45:08) mysql安装 Ver 14.14 ...

  2. 那些在BAE上部署node.js碰到的坑

    在BAE上使用node.js半年多了,其中碰到了不少因为BAE云环境限制碰到的坑 写下来大家碰到了,也不用那么麻烦的去看好几天代码了,直接对症下药 官方公布的坑有: BAE是使用package.jso ...

  3. 关于Bootstrap的理解

    Web开发领域存在大量的反复劳动.以创建一个菜单为例,不同的人或是同一个人在不同的时期去构建一个菜单.他创建出来的菜单格式都会存在差异:随着构件的菜单越来越多,我们会发现假设将构建菜单这件事形成一个框 ...

  4. System.in中的read()方法

    大家先来看例如以下这个程序 public class TestInputStream { public static void main(String args[]) throws IOExcepti ...

  5. 编程之美 set 14 小飞的电梯调度算法

    题目 电梯每次上升只停一次, 求问电梯停在哪一楼能够保证乘坐电梯的所有乘客爬楼层的层数之和最小 思路 假设电梯的层数是 m, 乘客人数是 n 1. 枚举, 时间复杂度是 o(mn) 2. 滚动解法. ...

  6. swift - SQLite数据库的使用(引用)

    SQLite轻量级数据库在移动应用中使用非常普遍,但是目前的库是C编写的,为了方便使用,对SQLite相关的操作用Swift进行了封装.这个封装代码使用了一个开源项目SQLiteDB,地址是:http ...

  7. swift - storyboard(故事版)的使用

    iOS开发中,苹果公司提供了一种可视化的编程方式:即xib和storyboard,xib相对来说比较灵活,可以在纯代码的项目中使用, 也可以和storyboard配合使用,用法都差不多,下面来总结一下 ...

  8. 阿里云CentOS6.8云服务器配置安全组规则

    前提:已经购买阿里云服务器,域名解析也完成了 需要对安全组规则进行配置,才能进行访问 1.进入阿里云首页https://www.aliyun.com/,如下图 2.进入控制台首页,如下图 3.在上图页 ...

  9. .net Session延长过期时间

    一.全局网站(即服务器)级 IIS-网站-属性-Asp.net-编辑配置-状态管理-会话超时(分钟)-设置为120,即为2小时,即120分钟后如果当前用户没有操作,那么Session就会自动过期. 二 ...

  10. C/C++ 智能指针简单剖析

    导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题 ...