对爬虫爬取到的数据进行存储
已寫章節(jié)
第一章 網(wǎng)絡(luò)爬蟲入門
 第二章 基本庫的使用
 第三章 解析庫的使用
 第四章 數(shù)據(jù)存儲
 第五章 動態(tài)網(wǎng)頁的抓取
文章目錄
- 已寫章節(jié)
 
 
- 第四章 數(shù)據(jù)存儲
- 4.1 文件存儲
- 4.1.1 TXT文件存儲
- 4.1.2 JSON文件的存儲
- 4.1.3 CSV文件的存儲
- 4.1.3.1 CSV文件的寫入
 
- 4.1.3.2 CSV文件的讀取
 
- 4.2 關(guān)系型數(shù)據(jù)庫存儲
- 4.2.1 將數(shù)據(jù)存儲在Mysql中
- 4.2.1.1 準(zhǔn)備工作
- 4.2.1.2 使用PyMySQL實現(xiàn)和mysql的交互
 
 
 
第四章 數(shù)據(jù)存儲
用解析庫提取出我們想要的數(shù)據(jù)之后,接下來就是存儲數(shù)據(jù)了。保存的形式有很多,可以直接保存為文本文件,如:TXT,JSON,CSV等。也可以存儲到數(shù)據(jù)庫中,如關(guān)系型數(shù)據(jù)庫MySQL,非關(guān)系型數(shù)據(jù)庫MongoDB等。
4.1 文件存儲
4.1.1 TXT文件存儲
import requests from lxml import etree from fake_useragent import UserAgent# 將解析后的數(shù)據(jù)存儲為TXT文件 headers = {'user-Agent': UserAgent().chrome } response = requests.get('https://www.baidu.com/', headers=headers) html = etree.HTML(response.text, etree.HTMLParser()) #爬取百度熱榜 news = html.xpath('//*[@id="hotsearch-content-wrapper"]/li/a/span[2]/text()') print(news) with open('baiduHotNews.txt', 'w', encoding='utf-8') as file_object:for i in news:file_object.write(i+'\n')運行后當(dāng)前文件夾中將新建一個名為baiduHotNews.txt的文本文件,我的文件中的內(nèi)容為:
女記者稱遭家暴 丈夫:她也家暴我 3人冒充老干媽員工騙騰訊被公訴 就地過年是否允許親友聚會? 印度山洪暴發(fā) 或致100多人死亡 石家莊藁城區(qū)調(diào)整為中風(fēng)險 專門針對冷鏈的消毒劑來了上面只是一個簡單的例子,如果遇到更復(fù)雜的將爬取到的數(shù)據(jù)存儲到TXT文件中,就需要大家復(fù)習(xí)Python中的文件讀取的相關(guān)知識了!
4.1.2 JSON文件的存儲
JSON(JavaScript Object Notation),它是JavaScript對象標(biāo)記,它通過對象和數(shù)據(jù)的組合來表示數(shù)據(jù),構(gòu)造簡潔,但是結(jié)構(gòu)化程度非常高,是一種輕量級的數(shù)據(jù)交換格式。
Python3中使用json模塊來對JSON數(shù)據(jù)進行編碼和解碼,對應(yīng)于下面兩個函數(shù):
- json.dumps():對數(shù)據(jù)進行編碼
- json.loads():對數(shù)據(jù)進行解碼
使用json.dumps()方法將字典編碼為JSON
import json# 使用json.dumps()方法將字典編碼為JSON dic_data = {'id': '12345','name': 'Tom','age': 12 } json_data = json.dumps(dic_data) print(type(json_data)) print(json_data)運行結(jié)果:
<class 'str'> {"id": "12345", "name": "Tom", "age": 12}使用json.loads()方法將json解碼為字典
import json# 使用json.loads()方法將JSON解碼為字典 json_data = '{ "id":"12345","name":"Tom","age":12}' dic_data = json.loads(json_data) print(type(dic_data)) print(dic_data)運行結(jié)果:
<class 'dict'> {'id': '12345', 'name': 'Tom', 'age': 12}4.1.3 CSV文件的存儲
CSV(Comma-Separated Values,逗號分隔符)是存儲表格數(shù)據(jù)常用的文件格式。Microsoft Excel、WPS表格等許多應(yīng)用都支持CSV。說白了,csv文件就是Excel表格。
下面是一個CSV文件的例子:
fruit,price
apple,3.0
banana,3.5
每一行都用一個換行符分隔,列與列之間通常用逗號分隔。
Python中有一個很好用的庫,它可以讀寫csv文件,它是csv庫。
csv庫文檔
4.1.3.1 CSV文件的寫入
先讓我們看一個小例子:
import csv# 一個寫入csv文件的小例子 with open('file0.csv', 'a') as file_object: # 以附加寫模式打開文件file0.csv,并創(chuàng)建文件對象writer = csv.writer(file_object) # 初始化寫入對象writer.writerow(['fruit', 'date', 'price']) # 寫入一行數(shù)據(jù)writer.writerow(['apple', '2021-02-08', '3.5'])writer.writerow(['banana', '2021-07-07', '4.0'])writer.writerow(['strawberry', '2021-04-01', '10.0'])'a'指的是附加寫模式,如果打開的文件不存在,則會自動創(chuàng)建該文件,運行完之后,將在當(dāng)前python程序所在目錄中生成一個file0.csv文件,其中的內(nèi)容為:
fruit,date,priceapple,2021-02-08,3.5banana,2021-07-07,4.0strawberry,2021-04-01,10.0file0.csv文件也可以用Excel打開。
更改列與列之間的分隔符
使用delimiter參數(shù)更改列與列之間的分隔符:
import csv# 使用delimiter參數(shù)控制列與列之間的分隔符 with open('file1.csv', 'a') as file_object: # 以附加寫模式打開文件file0.csv,并創(chuàng)建文件對象writer = csv.writer(file_object, delimiter='|') # 初始化寫入對象writer.writerow(['fruit', 'date', 'price']) # 寫入一行數(shù)據(jù)writer.writerow(['apple', '2021-02-08', '3.5'])writer.writerow(['banana', '2021-07-07', '4.0'])writer.writerow(['strawberry', '2021-04-01', '10.0'])file1.csv中的內(nèi)容為:
fruit|date|priceapple|2021-02-08|3.5banana|2021-07-07|4.0strawberry|2021-04-01|10.0可以看到,列與列之間的分隔符被該成了|。
一次寫入多行
writerow()方法一次只能寫入一行,使用writerows()方法能一次寫入多行,但writerows()方法接收的是二維列表:
import csv# 使用writerows()方法一次將多行數(shù)據(jù)寫入CSV文件 with open('file2.csv', 'a') as file_object:writer = csv.writer(file_object)writer.writerow(['fruit', 'date', 'price'])writer.writerows([['apple', '2021-02-08', '3.5'],['banana', '2021-07-07', '4.0'],['strawberry', '2021-04-01', '10.0'], ])file2.csv中的內(nèi)容為:
fruit,date,priceapple,2021-02-08,3.5banana,2021-07-07,4.0strawberry,2021-04-01,10.0將字典寫入csv文件中
import csv# 將字典信息寫入csv文件 with open('file3.csv', 'a') as file_object:fieldnames = ['fruit', 'date', 'price']writer = csv.DictWriter(file_object, fieldnames=fieldnames) # 初始化一個字典寫入對象writer.writeheader() # 寫入頭信息writer.writerow({'fruit': 'apple', 'date': '2021-02-08', 'price': '3.5'}) # 寫入字典信息writer.writerow({'fruit': 'banana', 'date': '2021-07-07', 'price': '4.0'})writer.writerow({'fruit': 'strawberry', 'date': '2021-04-01', 'price': '10.0'})指定寫入的字符編碼
如果將中文寫入文件中,可能會出現(xiàn)亂碼,就需要給open()方法中指定編碼格式:
import csv# 寫入CSV文件并指定編碼方式 with open('file4.csv', 'a', encoding='utf-8') as file_object:fieldnames = ['fruit', 'date', 'price']writer = csv.DictWriter(file_object, fieldnames=fieldnames)writer.writeheader()writer.writerow({'fruit': 'banana', 'date': '2021-02-08', 'price': '3.5'})4.1.3.2 CSV文件的讀取
以上面的file4.csv文件為讀取的對象,讀取其中的內(nèi)容:
import csv# 讀取csv文件中的數(shù)據(jù)的簡單小例子 with open('file4.csv', 'r') as file_object:read = csv.reader(file_object)for i in read:if i:print(i)運行結(jié)果:
['fruit', 'date', 'price'] ['banana', '2021-02-08', '3.5']另外一種比較簡單讀取csv文件中的數(shù)據(jù)的方法是使用pandas中的read_csv()方法來讀取:
使用pandas庫之前需要安裝pandas庫,可以使用豆瓣源加快下載速度,
將pip的下載源改為豆瓣,以提高下載速度:
pip install pandas -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
import pandas as pd# 使用pandas.read_csv()方法讀取CSV文件 data = pd.read_csv('file4.csv') print(data)運行結(jié)果:
fruit date price 0 banana 2021-02-08 3.54.2 關(guān)系型數(shù)據(jù)庫存儲
關(guān)系型數(shù)據(jù)庫是基于關(guān)系模型的數(shù)據(jù)庫,而關(guān)系模型是通過二維表來保持的,所以它的存儲方式就是行列組成的表,每一列就是一個字段,每一行就是一條記錄。
常見的關(guān)系型數(shù)據(jù)庫有Mysql、SQLite、Oracle、SQL Server、DB2等。
4.2.1 將數(shù)據(jù)存儲在Mysql中
4.2.1.1 準(zhǔn)備工作
-  需要安裝MySQL 
-  Python和MySQL數(shù)據(jù)庫相連,需要使用驅(qū)動,Python中常用于和MySQL連接的驅(qū)動有PyMySQL和mysql-connector ,它們兩個很相似,學(xué)會其中的一個就可以了,我們以PyMySQL為例。 在cmd中使用如下的命令來安裝pymysql: pip install pymysql 
4.2.1.2 使用PyMySQL實現(xiàn)和mysql的交互
-  連接數(shù)據(jù)庫并測試是否連接成功 import pymysqlconn = pymysql.connect( # 構(gòu)造連接host='localhost',user='root',password='123456', //記得更改為你的用戶名、密碼、端口號port=3306, ) //測試是否連接成功 my_cursor = conn.cursor() # 構(gòu)造油標(biāo) my_cursor.execute('select version()') # 使用油標(biāo)執(zhí)行sql指令 data = my_cursor.fetchone() # 獲取執(zhí)行后的結(jié)果 print('Database Version', data) # 打印結(jié)果 my_cursor.close() # 釋放占用資源 conn.close()
 
-  創(chuàng)建數(shù)據(jù)庫、創(chuàng)建表 import pymysqlconn = pymysql.connect(host='localhost',user='root',password='123456', //記得更改為你的用戶名、密碼、端口號port=3306, ) my_cursor = conn.cursor() my_cursor.execute('create database test_db;') my_cursor.execute('use test_db') my_cursor.execute("create table if not exists tb1(""id int,""name varchar(20),""age int,""primary key (id)"") ENGINE=INNODB CHARSET='utf8mb4' COLLATE='utf8mb4_unicode_ci';")上面的代碼將新建一個名為test_db的數(shù)據(jù)庫,并在這個數(shù)據(jù)庫下新建一個名為tb1的表,表中有三個字段,分別是id,name,age,下面的例子都將在這個基礎(chǔ)上實踐。 
 
-  向表中插入數(shù)據(jù) import pymysqlconn = pymysql.connect(host='localhost',user='root',passwd='123456',port=3306,db='test_db',charset='utf8mb4', ) try:with conn.cursor() as my_cursor:sql_insert = 'insert into tb1 values(%s, %s, %s)'# 一次插入一行數(shù)據(jù)row_affected = my_cursor.execute(sql_insert, (1, 'Tom', 19))print('插入一行數(shù)據(jù)后影響的行數(shù):', row_affected)# 一次插入多行數(shù)據(jù)rows_affected = my_cursor.executemany(sql_insert, [(2, 'Emma', 20), (3, 'Mary', 19)])print('插入多行數(shù)據(jù)后影響的行數(shù):', rows_affected)conn.commit() # 數(shù)據(jù)發(fā)生變化要記得提交到數(shù)據(jù)庫中 except:conn.rollback() # 如果有異常就回滾conn.close()注意:executemany()方法接收的是一個列表,且列表中的每一個元素必須是元組! 
 
-  更改數(shù)據(jù) import pymysqlconn = pymysql.connect(host='localhost',user='root',passwd='123456',port=3306,db='test_db',charset='utf8mb4', ) try:with conn.cursor() as my_cursor:sql_update = "UPDATE tb1 SET age=%s WHERE id=%s;"my_cursor.execute(sql_update, (60, 1))conn.commit() except:print('error')conn.rollback()conn.close()
 
-  查詢數(shù)據(jù) import pymysqlconn = pymysql.connect(host='localhost',user='root',passwd='123456',port=3306,db='test_db',charset='utf8mb4', ) try:with conn.cursor() as my_cursor:sql_select = 'select * from tb1;'my_cursor.execute(sql_select)print('查詢結(jié)果的條數(shù):', my_cursor.rowcount)print('-'*100)first_one = my_cursor.fetchone()print(first_one)print('-' * 100)all = my_cursor.fetchall()for i in all:print(i)except:print('error')conn.rollback()conn.close()
 
-  刪除數(shù)據(jù) import pymysqlconn = pymysql.connect(host='localhost',user='root',passwd='123456',port=3306,db='test_db',charset='utf8mb4', ) try:with conn.cursor() as my_cursor:sql_delete = 'delete from tb1 where id=%s;'del_rows = my_cursor.execute(sql_delete, (1, ))conn.commit()print('刪除的記錄條數(shù)為:', del_rows) except:print('error')conn.rollback()conn.close()
注意:對數(shù)據(jù)庫中的數(shù)據(jù)進行改變的操作都要用conn.commit()將更改提交到數(shù)據(jù)庫中,否則你使用Python對數(shù)據(jù)庫的操作都是無效的。
要使用Python來操作MySQL數(shù)據(jù)庫,Python代碼大多相同,關(guān)鍵是要會MySQL。
上面就是幾種常見的將Python爬蟲爬取到的數(shù)據(jù)進行存儲的方法了,感謝你的閱讀。
總結(jié)
以上是生活随笔為你收集整理的对爬虫爬取到的数据进行存储的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Python爬虫 解析库的使用
- 下一篇: 游戏改变利器!a10独显内存三大亮点解析
