語(yǔ)法解析及其在Python爬蟲(chóng)中的應(yīng)用)
一.簡(jiǎn)介MySQL 是一個(gè)開(kāi)源、免費(fèi)且成熟穩(wěn)定的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)RDBMS被廣泛應(yīng)用于各類 Web 應(yīng)用和爬蟲(chóng)數(shù)據(jù)存儲(chǔ)中。 所謂“關(guān)系型”指的是它將數(shù)據(jù)以二維表格的形式組織存儲(chǔ)類似 Excel 工作表表與表之間可以通過(guò)共有的字段如用戶ID建立關(guān)聯(lián)配合結(jié)構(gòu)化查詢語(yǔ)言SQL能夠?qū)?shù)據(jù)進(jìn)行非常嚴(yán)謹(jǐn)、靈活的增刪改查操作并嚴(yán)格保證數(shù)據(jù)的一致性和完整性支持事務(wù) ACID。在爬蟲(chóng)開(kāi)發(fā)中MySQL 常作為最終的數(shù)據(jù)歸宿地通過(guò)編寫(xiě) Pipeline 組件將 Scrapy 抓取的清洗后數(shù)據(jù)持久化存儲(chǔ)到本地或云端的 MySQL 服務(wù)中便于后續(xù)的查詢與分析。二.可視化結(jié)構(gòu)由于MySQL本身是在cmd命令行中操作的因此需要借助可視化工具獲得更好更直觀的使用體驗(yàn)常用第三方可視化工具有Navicat、DBeaver等等這里使用DBeaver進(jìn)行演示。右側(cè)端口號(hào)為3306的localhost就是我們電腦上的MySQL服務(wù)程序MySQL數(shù)據(jù)庫(kù)默認(rèn)端口號(hào)是3306下面數(shù)據(jù)庫(kù)一欄中放著默認(rèn)數(shù)據(jù)庫(kù)和我們創(chuàng)建的所有數(shù)據(jù)庫(kù)在使用中我們應(yīng)避免使用默認(rèn)數(shù)據(jù)庫(kù)。三.SQL語(yǔ)言由于數(shù)據(jù)庫(kù)管理系統(tǒng)功能非常多不僅存儲(chǔ)數(shù)據(jù)還包含數(shù)據(jù)的管理、表的管理、庫(kù)的管理、賬戶管理、權(quán)限管理等等所以操作數(shù)據(jù)庫(kù)的SQL語(yǔ)言也基于功能被劃分為四大類。SQL語(yǔ)句大小寫(xiě)不敏感,命令結(jié)束必須帶分號(hào)1.數(shù)據(jù)定義DDLData Definition Language庫(kù)與表的操作a.庫(kù)的相關(guān)操作輸入命令show databases;查看數(shù)據(jù)庫(kù)。輸入命令use 數(shù)據(jù)庫(kù)名稱;使用和切換數(shù)據(jù)庫(kù)后續(xù)想要更換數(shù)據(jù)庫(kù)進(jìn)行操作也輸入此命令。輸入命令select database();查看當(dāng)前正在使用的數(shù)據(jù)庫(kù)鼠標(biāo)選中單條命令可單獨(dú)執(zhí)行此命令。輸入命令create database [if not exists] 數(shù)據(jù)庫(kù)名稱 [charset 編碼名稱];創(chuàng)建數(shù)據(jù)庫(kù)中括號(hào)表示可寫(xiě)可不寫(xiě)寫(xiě)的話不用寫(xiě)括號(hào)直接寫(xiě)命令如果加第一個(gè)括號(hào)中的內(nèi)容表示如果存在同名數(shù)據(jù)庫(kù)就不進(jìn)行任操作反之創(chuàng)建數(shù)據(jù)庫(kù)。第二個(gè)括號(hào)中內(nèi)容作用是設(shè)置編碼方式MySQL默認(rèn)utf-8編碼這里不用加橫杠最好顯式設(shè)置一下。注左側(cè)不顯示數(shù)據(jù)庫(kù)就右擊刷新一下。輸入命令drop database 數(shù)據(jù)庫(kù)名稱;刪除指定數(shù)據(jù)庫(kù)。b.表的相關(guān)操作在我們創(chuàng)建表時(shí)要為列指定一個(gè)列類型列類型有以下幾種可按需選擇輸入命令create table [if not exists] 表名稱( 列名稱 列類型, 列名稱 列類型, ......);創(chuàng)建表注意圖中格式且最后一行沒(méi)逗號(hào)如果加括號(hào)中的內(nèi)容表示如果存在同名表就不進(jìn)行任操作反之創(chuàng)建表。輸入命令rename table 舊表名 to 新表名;來(lái)修改表名。輸入命令alter table 表名 add 列名 列類型;單獨(dú)添加一列不能添加數(shù)據(jù)。輸入命令alter table 表名 change 舊列名 新列名 新列類型;更改列名和列類型如需只更改類型寫(xiě)相同列名即可。輸入命令alter table 表名 drop 列名;單獨(dú)刪除一列。輸入命令show tables;查看表注在此之前應(yīng)先用use選擇使用哪個(gè)數(shù)據(jù)庫(kù)。輸入命令desc 表名;查看表結(jié)構(gòu)每一列的類型等信息庫(kù)里有多張表難免會(huì)忘記某張表的設(shè)置信息這時(shí)就需要靠此命令查詢。輸入命令drop table 表名;刪除指定數(shù)據(jù)表。2.數(shù)據(jù)操縱DMLData Manipulation Language增刪改數(shù)據(jù)a.數(shù)據(jù)插入字符串最好用單引號(hào)輸入命令insert into 表名(列名) values(值1)[, (值2), (值3)......];進(jìn)行單列插入插入一條或多條數(shù)據(jù)。輸入命令insert into 表名(列1, 列2, 列3, ......) values(列1對(duì)應(yīng)值, 列2對(duì)應(yīng)值, 列3對(duì)應(yīng)值, ......), [(列1對(duì)應(yīng)值, 列2對(duì)應(yīng)值, 列3對(duì)應(yīng)值, ......), ......];進(jìn)行多列插入插入一條或多條數(shù)據(jù)。注多列插入可以省略列名但值的位置和類型必須一一對(duì)應(yīng)b.數(shù)據(jù)刪除條件判斷的常見(jiàn)操作符輸入命令delete from 表名稱 [where 條件判斷];從表中刪除數(shù)據(jù)。如果不加中括號(hào)中的條件判斷句就是清空整張表中的數(shù)據(jù)但不刪除表格。c.數(shù)據(jù)更新輸入命令update 表名 set 列 值 [where 條件判斷];進(jìn)行數(shù)據(jù)更新操作。不寫(xiě)條件判斷就是修改整張表中指定列的所有值。3.數(shù)據(jù)查詢DQLData Query Language查詢和計(jì)算數(shù)據(jù)a.基礎(chǔ)查詢輸入命令select 字段列表 | * from 表;進(jìn)行數(shù)據(jù)查詢“ | ”表示前后可選。“ * ”是通配符代表所有。b.分組聚合簡(jiǎn)介如果要統(tǒng)計(jì)一個(gè)班級(jí)中男生和女生的人數(shù)就需要先按性別分組再i統(tǒng)計(jì)每組人數(shù)這就是分組聚合。常用聚合函數(shù);輸入命令select 字段 | 聚合函數(shù) from 表 [where 條件] group by 列;進(jìn)行分組聚合操作group by后寫(xiě)了誰(shuí)字段中才能出現(xiàn)誰(shuí)但聚合函數(shù)無(wú)限制可以有一個(gè)或多個(gè)。由于這個(gè)結(jié)果并不夠直觀我們可以加上gender字段增加視覺(jué)效果如果字段和聚合函數(shù)同時(shí)存在中間要有逗號(hào)隔開(kāi)否則報(bào)錯(cuò)聚合函數(shù)可以有一個(gè)或多個(gè)中間同樣要逗號(hào)隔開(kāi)這里count(gender)表示滿足條件且有性別的數(shù)據(jù)有幾條。c.排序分頁(yè)輸入命令select 列 | 聚合函數(shù) | * from 表 where ... group by ... order by ... [asc | desc];指定某個(gè)列進(jìn)行排序其中asc即ascending代表升序desc即descending代表降序。desc降序排列。輸入命令select 列 | 聚合函數(shù) | * from 表 where ... group by ... order by ... [asc | desc] limit n[ , m];進(jìn)行限制排序和分頁(yè)如果limit后只有n則返回符合前置條件且排名前n條的數(shù)據(jù)。limit后n和m都有則顯示符合前置條件的數(shù)據(jù)從第n1條開(kāi)始到第m條。四.Python操作MySQL的基本方法1.連接MySQL要用Python操作MySQL儲(chǔ)存我們爬取的數(shù)據(jù)必須要用到一個(gè)名為pymysql的第三方庫(kù)按winR輸入cmd打開(kāi)終端輸入命令pip install pymysql進(jìn)行安裝然后進(jìn)行后續(xù)操作。安裝完成后我們就可以用python與MySQL數(shù)據(jù)庫(kù)進(jìn)行基礎(chǔ)的連接注意當(dāng)前項(xiàng)目文件名不能出現(xiàn)pymysql否則會(huì)報(bào)錯(cuò)2.執(zhí)行SQL語(yǔ)句在Python代碼中寫(xiě)SQL語(yǔ)句時(shí)可以末尾可以不加分號(hào)但在可視化界面或MySQL環(huán)境中必須加分號(hào)a.執(zhí)行非查詢性質(zhì)的SQL語(yǔ)句在Python中我們需要游標(biāo)對(duì)象來(lái)執(zhí)行SQL語(yǔ)句因此我們要先用連接對(duì)象來(lái)實(shí)例化游標(biāo)對(duì)象并用連接對(duì)象選擇目標(biāo)數(shù)據(jù)庫(kù)然后就可以在游標(biāo)對(duì)象.execute( )中寫(xiě)SQL語(yǔ)句了且這里SQL語(yǔ)句一定要加引號(hào)。b.執(zhí)行查詢性質(zhì)的SQL語(yǔ)句由于查詢性質(zhì)的SQL語(yǔ)句我們需要接收查詢的結(jié)果所以寫(xiě)法略有不同。需要先用游標(biāo)對(duì)象獲取查詢結(jié)果再用一個(gè)變量接收這個(gè)結(jié)果該結(jié)果是一個(gè)雙層嵌套的元組。c.執(zhí)行數(shù)據(jù)插入通過(guò)Python往MySQL數(shù)據(jù)庫(kù)插入數(shù)據(jù)時(shí)需通過(guò)commit確認(rèn)插入否則運(yùn)行后數(shù)據(jù)庫(kù)內(nèi)數(shù)據(jù)也不會(huì)發(fā)生改變?nèi)绮幌胧謩?dòng)進(jìn)行插入可在連接對(duì)象中設(shè)置自動(dòng)插入。輸入連接對(duì)象.commit()確認(rèn)數(shù)據(jù)插入。在連接對(duì)象conn中設(shè)置autocommit True實(shí)現(xiàn)自動(dòng)提交后面所有的插入語(yǔ)句都無(wú)需手動(dòng)確認(rèn)。