Python3爬虫学习之将爬取的信息保存到本地的方法详解
作者:Veniendeavor 发布时间:2023-01-07 14:20:26
本文实例讲述了Python3爬虫学习之将爬取的信息保存到本地的方法。分享给大家供大家参考,具体如下:
将爬取的信息存储到本地
之前我们都是将爬取的数据直接打印到了控制台上,这样显然不利于我们对数据的分析利用,也不利于保存,所以现在就来看一下如何将爬取的数据存储到本地硬盘。
1 对.txt文件的操作
读写文件是最常见的操作之一,python3 内置了读写文件的函数:open
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None))
Open file and return a corresponding file object. If the file cannot be opened, an OSError
is raised.
其中比较常用的参数为file和mode,参数file为文件的路径,参数mode为操作文件的方式(读/写),函数的返回值为一个file对象,如果文件操作出现异常的话,则会抛出 一个OSError
还以简书首页文章题目为例,将爬取到的文章标题存放到一个.txt文件中,具体代码如下:
# -*- coding:utf-8 -*-
from urllib import request
from bs4 import BeautifulSoup
url = r'http://www.jianshu.com'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
page = request.Request(url, headers=headers)
page_info = request.urlopen(page).read().decode('utf-8')
soup = BeautifulSoup(page_info, 'html.parser')
titles = soup.find_all('a', 'title')
try:
# 在E盘以只写的方式打开/创建一个名为 titles 的txt文件
file = open(r'E:\titles.txt', 'w')
for title in titles:
# 将爬去到的文章题目写入txt中
file.write(title.string + '\n')
finally:
if file:
# 关闭文件(很重要)
file.close()
open中mode参数的含义见下表:
符号 | 含义 |
---|---|
r' | 以只读模式打开文件(默认模式) |
w' | 以只写的方式打开文件,如果文件存在的话会先删除再重新创建 |
x' | 以独占的方式打开文件,如果文件已经存在则错误 |
a' | 以写的形式打开文件,若文件已存在,则以追加的方式写入 |
b' | 二进制模式 |
t' | 文本模式(默认) |
+' | 更新文件(读/写) |
其中't'为默认模式,'r'相当于'rt',符号可以叠加使用,像'r+b'
另外,对文件操作一定要注意的一点是:打开的文件一定要关闭,否则会占用相当大的系统资源,所以对文件的操作最好使用try:...finally:...的形式。但是try:...finally:...的形式会使代码显得比较杂乱,所幸python中的with语句可以帮我们自动调用close()而不需要我们写出来,所以,上面代码中的try:...finally:...可使用下面的with语句来代替:
with open(r'E:\title.txt', 'w') as file:
for title in titles:
file.write(title.string + '\n')
效果是一样的,建议使用with
语句
2 图片的储存
有时候我们的爬虫不一定只是爬取文本数据,也会爬取一些图片,下面就来看怎么将爬取的图片存到本地磁盘。
我们先来选好目标,知乎话题:女生怎么健身锻造好身材? (单纯因为图多,不要多想哦 (# _ # ) )
看下页面的源代码,找到话题下图片链接的格式,如图:
可以看到,图片在img标签中,且class=origin_image zh-lightbox-thumb
,而且链接是由.jpg结尾,我们便可以用Beautiful Soup结合正则表达式的方式来提取所有链接,如下:
links = soup.find_all('img', "origin_image zh-lightbox-thumb",src=re.compile(r'.jpg$'))
提取出所有链接后,使用request.urlretrieve来将所有链接保存到本地
Copy a network object denoted by a URL to a local file. If the URL points to a local file, the object will not be copied unless filename is supplied. Return a tuple (filename, headers)
where filename is the local file name under which the object can be found, and headers is whatever the info()
method of the object returned by urlopen()
returned (for a remote object). Exceptions are the same as for urlopen()
.
具体实现代码如下:
# -*- coding:utf-8 -*-
import time
from urllib import request
from bs4 import BeautifulSoup
import re
url = r'https://www.zhihu.com/question/22918070'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
page = request.Request(url, headers=headers)
page_info = request.urlopen(page).read().decode('utf-8')
soup = BeautifulSoup(page_info, 'html.parser')
# Beautiful Soup和正则表达式结合,提取出所有图片的链接(img标签中,class=**,以.jpg结尾的链接)
links = soup.find_all('img', "origin_image zh-lightbox-thumb",src=re.compile(r'.jpg$'))
# 设置保存的路径,否则会保存到程序当前路径
local_path = r'E:\Pic'
for link in links:
print(link.attrs['src'])
# 保存链接并命名,time防止命名冲突
request.urlretrieve(link.attrs['src'], local_path+r'\%s.jpg' % time.time())
运行结果
PS:希望大家进行图片爬取的时候,尽量不要将爬下来图片作为商用,特别是摄影作品,都是具有版权的,嗯。。。还有就是注意营养哦~~~
希望本文所述对大家Python程序设计有所帮助。
来源:https://www.jianshu.com/p/eb2a5f01abfb


猜你喜欢
- lambda函数用法lambda非常重要的一个定义。lambda在【运行时】才绑定,【不是】在定义的时候绑定。下面这个列子:本意想:让X分别
- 后边要做一个微信小程序,并要能获取用户微信绑定的手机号码。而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返
- 假设现有需求如下:需要一个页面分页展示信息,在该页面添加搜索框以提供检索功能。那么,我们知道,展示信息和检索功能是在同一个页面,也就是共用一
- 本文实例讲述了Python实现MySQL操作的方法。分享给大家供大家参考,具体如下:1. 安装MySQLdb.从网站下载Mysql for
- 用python实现的抓取腾讯视频所有电影的爬虫# -*- coding: utf-8 -*-import reimport urllib2f
- 以下的文章主要是介绍SQL Server数据库与其实际应用元数据,我前两天在相关网站看见SQL Server数据库与其实际应用元数据的资料,
- 说下整体思路1、服务器安装ffmpeg2、使用ffmpeg -i 指令来转换amr为mp3格式(这个到时候写在PHP代码中,使用exec函数
- 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述
- 说明1、在使用之前需要在settings中打开。2、pipeline在settings中键表示位置(即pipeline在项目中的位置可以自定
- 最近公司项目加了个页面,其中要求是这样的,点击对应列表,展开和收起,其实就是显示和隐藏内容部分;说来惭愧,我花了半天时间才搞出来(自黑一下~
- 50个常用sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(
- 已知有一个XML文件(bookstore.xml)如下:<?xml version="1.0" encoding=
- 本文实例为大家分享了Python生成树形图案的具体代码,供大家参考,具体内容如下先看一下效果,见下图。上面这颗大树是使用Python + T
- 1、取得控制台应用程序的根目录方法 方法1、Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径
- MySQL批量插入问题在开发项目时,因为有一些旧系统的基础数据需要提前导入,所以我在导入时做了批量导入操作 ,但是因为MySQL中的一次可接
- 1.什么是解构?ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。它在语法上比ES5所提供的更加简洁、紧凑、清晰。
- 前言;Python基础知识+结构+数据类型Python基础学习列表+元组+字典+集合Python基础学习函数+模块+类今天给大家分享的是第四
- 旁站查询来源:http://dns.aizhan.comhttp://s.tool.chinaz.com/samehttp://i.link
- 本文讲述了python开发之IDEL(Python GUI)的使用方法。分享给大家供大家参考,具体如下:在安装完Python后,我们希望能够
- 本文介绍一种将一个大的文本文件分割成多个小文件的方法方法一:1.读取文章所有的行,并存入列表中2.定义分割成的小文本的行数3.将原文本内容按