Python爬取数据并写入MySQL
關(guān)于爬蟲爬取數(shù)據(jù)并存入MySQL數(shù)據(jù)庫(以東方財(cái)富網(wǎng)上的股票數(shù)據(jù)為例,網(wǎng)頁:深南電A(000037)資金流向 _ 數(shù)據(jù)中心 _ 東方財(cái)富網(wǎng))
第一步,創(chuàng)建數(shù)據(jù)庫中的數(shù)據(jù)表
import requests import pandas as pd import re import pymysqldb = pymysql.connect(host='localhost', user='root', password='ls101945', db='東方財(cái)富', port=3306, charset='utf8') cursor = db.cursor()#建立游標(biāo) cursor.execute("DROP TABLE IF EXISTS 東方財(cái)富")#如果有表叫東方財(cái)富,刪除表 sql = """create table 東方財(cái)富( 日期 char(20) not null,主力凈流入凈額 char(20),小單凈流入凈額 char(20),中單凈流入凈額 char(20),大單凈流入凈額 char(20),超大單凈流入凈額 char(20) ,主力凈流入凈占比 char(20),小單凈流入凈占比 char(20),中單凈流入凈占比 char(20),大單凈流入凈占比 char(20),超大單凈流入凈占比 char(20),收盤價(jià) char(20),漲跌幅 char(20))""" try:#如果出現(xiàn)異常對(duì)異常處理# 執(zhí)行SQL語句cursor.execute(sql)print("創(chuàng)建數(shù)據(jù)庫成功") except Exception as e:print("創(chuàng)建數(shù)據(jù)庫失敗:case%s" % e)導(dǎo)入pymysql,連接到東方財(cái)富數(shù)據(jù)庫,開啟游標(biāo)功能,創(chuàng)建游標(biāo)對(duì)象(注意:當(dāng)開啟游標(biāo)功能執(zhí)行這個(gè)sql語句后,系統(tǒng)并不會(huì)將結(jié)果直接打印到頻幕上,而是將上述得到的結(jié)果,找個(gè)地方存儲(chǔ)起來,提供一個(gè)游標(biāo)接口給我們,當(dāng)你需要獲取數(shù)據(jù)的時(shí)候,就可以從中拿數(shù)據(jù)),使用sql語句建立數(shù)據(jù)表,設(shè)計(jì)字段名,類型,能不能為空值。使用execute()方法,執(zhí)行sql語句。在程序開發(fā)中,如果對(duì)某些代碼的執(zhí)行不能確定(程序語法完全正確),可以增加try來捕獲異常,try:嘗試執(zhí)行的代碼,except:出現(xiàn)錯(cuò)誤的處理。
第二步,爬取數(shù)據(jù)
在目標(biāo)網(wǎng)頁中點(diǎn)擊左鍵-檢查-網(wǎng)絡(luò),刷新網(wǎng)頁,找到數(shù)據(jù)存儲(chǔ)的位置
?
??
?
url = 'https://push2his.eastmoney.com/api/qt/stock/fflow/daykline/get?cb=jQuery112301445006905131534_1634624378230&lmt'\'=0&klt=101&fields1=f1%2Cf2%2Cf3%2Cf7&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61%2Cf62%'\'2Cf63%2Cf64%2Cf65&ut=b2884a393a59ad64002292a3e90d46a5&secid=0.000037&_=1634624378231' headers = {'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50'} #發(fā)送url鏈接的請(qǐng)求,并返回響應(yīng)數(shù)據(jù) response = requests.get(url=url, headers=headers) page_text = response.text #使用正則表達(dá)式獲取數(shù)據(jù) pat = '"klines":\[(.*?)\]'#(.*?)就是我們要取出的部分 data = re.compile(pat, re.S).findall(page_text)#compile函數(shù)編譯正則匹配表達(dá)式,re.S代表可以換行匹配,使用findall函數(shù)選定數(shù)據(jù)集,也就是爬取的所有源代碼url和headers可以在其中找到,構(gòu)造請(qǐng)求頭,發(fā)送url鏈接的請(qǐng)求,并返回響應(yīng)數(shù)據(jù),使用正則表達(dá)式獲取數(shù)據(jù)。
第三步,寫入數(shù)據(jù)庫
datas = data[0].split('","')#分割字符串for i in range(len(datas)):stock = list(datas[i].replace('"', "").split(","))#把“替換為空格,以,為分隔符分割 #用sql語言寫入數(shù)據(jù)表sql1 = """insert into 東方財(cái)富(日期,主力凈流入凈額,小單凈流入凈額,中單凈流入凈額,大單凈流入凈額,超大單凈流入凈額,主力凈流入凈占比,小單凈流入凈占比,中單凈流入凈占比,大單凈流入凈占比,超大單凈流入凈占比 ,收盤價(jià) ,漲跌幅 )value('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')""" % (stock[0], stock[1], stock[2], stock[3], stock[4], stock[5], stock[6], stock[7], stock[8], stock[9], stock[10],stock[11], stock[12])#將值插入到占位符%s# 執(zhí)行 insert 增加的語句 如果出現(xiàn)異常對(duì)異常處理try:cursor.execute(sql1)db.commit() #進(jìn)行數(shù)據(jù)庫提交,寫入數(shù)據(jù)庫except:cursor.rollback() #數(shù)據(jù)回滾,多次操作要么都執(zhí)行,要么都不執(zhí)行print('寫入失敗')# 關(guān)閉游標(biāo)連接 cursor.close() # 關(guān)閉數(shù)據(jù)庫連接 db.close() print('寫入成功!')把爬取出來的數(shù)據(jù)按逗號(hào)分割,用sql語言的insert插入到東方財(cái)富數(shù)據(jù)表,value賦值。使用execute()方法,執(zhí)行sql語句后一定要用commit()方法提交,在數(shù)據(jù)庫里增、刪、改的時(shí)候,必須要進(jìn)行提交,否則插入的數(shù)據(jù)不生效。rollback()方法:不想提交增、刪、改操作,用此方法回滾取消操作,有多次操作時(shí),全部取消。用try捕獲異常,如果執(zhí)行sql或向數(shù)據(jù)庫提交時(shí)有異常,就取消所有對(duì)數(shù)據(jù)庫的修改操作。
最終效果
?
總結(jié)
以上是生活随笔為你收集整理的Python爬取数据并写入MySQL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浏览器三种刷新方式
- 下一篇: OpenGL混合模式