对爬虫爬取到的数据进行存储
已寫章節
第一章 網絡爬蟲入門
第二章 基本庫的使用
第三章 解析庫的使用
第四章 數據存儲
第五章 動態網頁的抓取
文章目錄
- 已寫章節
- 第四章 數據存儲
- 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 關系型數據庫存儲
- 4.2.1 將數據存儲在Mysql中
- 4.2.1.1 準備工作
- 4.2.1.2 使用PyMySQL實現和mysql的交互
第四章 數據存儲
用解析庫提取出我們想要的數據之后,接下來就是存儲數據了。保存的形式有很多,可以直接保存為文本文件,如:TXT,JSON,CSV等。也可以存儲到數據庫中,如關系型數據庫MySQL,非關系型數據庫MongoDB等。
4.1 文件存儲
4.1.1 TXT文件存儲
import requests from lxml import etree from fake_useragent import UserAgent# 將解析后的數據存儲為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')運行后當前文件夾中將新建一個名為baiduHotNews.txt的文本文件,我的文件中的內容為:
女記者稱遭家暴 丈夫:她也家暴我 3人冒充老干媽員工騙騰訊被公訴 就地過年是否允許親友聚會? 印度山洪暴發 或致100多人死亡 石家莊藁城區調整為中風險 專門針對冷鏈的消毒劑來了上面只是一個簡單的例子,如果遇到更復雜的將爬取到的數據存儲到TXT文件中,就需要大家復習Python中的文件讀取的相關知識了!
4.1.2 JSON文件的存儲
JSON(JavaScript Object Notation),它是JavaScript對象標記,它通過對象和數據的組合來表示數據,構造簡潔,但是結構化程度非常高,是一種輕量級的數據交換格式。
Python3中使用json模塊來對JSON數據進行編碼和解碼,對應于下面兩個函數:
- json.dumps():對數據進行編碼
- json.loads():對數據進行解碼
使用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)運行結果:
<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)運行結果:
<class 'dict'> {'id': '12345', 'name': 'Tom', 'age': 12}4.1.3 CSV文件的存儲
CSV(Comma-Separated Values,逗號分隔符)是存儲表格數據常用的文件格式。Microsoft Excel、WPS表格等許多應用都支持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,并創建文件對象writer = csv.writer(file_object) # 初始化寫入對象writer.writerow(['fruit', 'date', 'price']) # 寫入一行數據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'指的是附加寫模式,如果打開的文件不存在,則會自動創建該文件,運行完之后,將在當前python程序所在目錄中生成一個file0.csv文件,其中的內容為:
fruit,date,priceapple,2021-02-08,3.5banana,2021-07-07,4.0strawberry,2021-04-01,10.0file0.csv文件也可以用Excel打開。
更改列與列之間的分隔符
使用delimiter參數更改列與列之間的分隔符:
import csv# 使用delimiter參數控制列與列之間的分隔符 with open('file1.csv', 'a') as file_object: # 以附加寫模式打開文件file0.csv,并創建文件對象writer = csv.writer(file_object, delimiter='|') # 初始化寫入對象writer.writerow(['fruit', 'date', 'price']) # 寫入一行數據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中的內容為:
fruit|date|priceapple|2021-02-08|3.5banana|2021-07-07|4.0strawberry|2021-04-01|10.0可以看到,列與列之間的分隔符被該成了|。
一次寫入多行
writerow()方法一次只能寫入一行,使用writerows()方法能一次寫入多行,但writerows()方法接收的是二維列表:
import csv# 使用writerows()方法一次將多行數據寫入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中的內容為:
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'})指定寫入的字符編碼
如果將中文寫入文件中,可能會出現亂碼,就需要給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文件為讀取的對象,讀取其中的內容:
import csv# 讀取csv文件中的數據的簡單小例子 with open('file4.csv', 'r') as file_object:read = csv.reader(file_object)for i in read:if i:print(i)運行結果:
['fruit', 'date', 'price'] ['banana', '2021-02-08', '3.5']另外一種比較簡單讀取csv文件中的數據的方法是使用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)運行結果:
fruit date price 0 banana 2021-02-08 3.54.2 關系型數據庫存儲
關系型數據庫是基于關系模型的數據庫,而關系模型是通過二維表來保持的,所以它的存儲方式就是行列組成的表,每一列就是一個字段,每一行就是一條記錄。
常見的關系型數據庫有Mysql、SQLite、Oracle、SQL Server、DB2等。
4.2.1 將數據存儲在Mysql中
4.2.1.1 準備工作
-
需要安裝MySQL
-
Python和MySQL數據庫相連,需要使用驅動,Python中常用于和MySQL連接的驅動有PyMySQL和mysql-connector ,它們兩個很相似,學會其中的一個就可以了,我們以PyMySQL為例。
在cmd中使用如下的命令來安裝pymysql:
pip install pymysql
4.2.1.2 使用PyMySQL實現和mysql的交互
-
連接數據庫并測試是否連接成功
import pymysqlconn = pymysql.connect( # 構造連接host='localhost',user='root',password='123456', //記得更改為你的用戶名、密碼、端口號port=3306, ) //測試是否連接成功 my_cursor = conn.cursor() # 構造油標 my_cursor.execute('select version()') # 使用油標執行sql指令 data = my_cursor.fetchone() # 獲取執行后的結果 print('Database Version', data) # 打印結果 my_cursor.close() # 釋放占用資源 conn.close()
-
創建數據庫、創建表
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的數據庫,并在這個數據庫下新建一個名為tb1的表,表中有三個字段,分別是id,name,age,下面的例子都將在這個基礎上實踐。
-
向表中插入數據
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)'# 一次插入一行數據row_affected = my_cursor.execute(sql_insert, (1, 'Tom', 19))print('插入一行數據后影響的行數:', row_affected)# 一次插入多行數據rows_affected = my_cursor.executemany(sql_insert, [(2, 'Emma', 20), (3, 'Mary', 19)])print('插入多行數據后影響的行數:', rows_affected)conn.commit() # 數據發生變化要記得提交到數據庫中 except:conn.rollback() # 如果有異常就回滾conn.close()注意:executemany()方法接收的是一個列表,且列表中的每一個元素必須是元組!
-
更改數據
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()
-
查詢數據
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('查詢結果的條數:', 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()
-
刪除數據
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('刪除的記錄條數為:', del_rows) except:print('error')conn.rollback()conn.close()
注意:對數據庫中的數據進行改變的操作都要用conn.commit()將更改提交到數據庫中,否則你使用Python對數據庫的操作都是無效的。
要使用Python來操作MySQL數據庫,Python代碼大多相同,關鍵是要會MySQL。
上面就是幾種常見的將Python爬蟲爬取到的數據進行存儲的方法了,感謝你的閱讀。
總結
以上是生活随笔為你收集整理的对爬虫爬取到的数据进行存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python爬虫 解析库的使用
- 下一篇: Mybatis配置文件头