小白學 Python 爬蟲(25):爬取股票資訊
人生苦短,我用 Python
前文傳送門:
小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝
小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門
小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門
小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝
小白學 Python 爬蟲(10):Session 和 Cookies
小白學 Python 爬蟲(11):urllib 基礎使用(一)
小白學 Python 爬蟲(12):urllib 基礎使用(二)
小白學 Python 爬蟲(13):urllib 基礎使用(三)
小白學 Python 爬蟲(14):urllib 基礎使用(四)
小白學 Python 爬蟲(15):urllib 基礎使用(五)
小白學 Python 爬蟲(16):urllib 實戰之爬取妹子圖
小白學 Python 爬蟲(17):Requests 基礎使用
小白學 Python 爬蟲(18):Requests 進階操作
小白學 Python 爬蟲(21):解析庫 Beautiful Soup(上)
小白學 Python 爬蟲(22):解析庫 Beautiful Soup(下)
小白學 Python 爬蟲(23):解析庫 pyquery 入門
引言
上一篇的實戰寫到最後沒有用到頁面元素解析,感覺有點小遺憾,不過最後的電影列表還是挺香的,真的推薦一看。
本次選題是先寫好程式碼再寫的文章,絕對可以用到頁面元素解析,並且還需要對網站的資料載入有一定的分析,才能得到最終的資料,並且小編找的這兩個資料來源無 ip 訪問限制,質量有保證,絕對是小白練手的絕佳之選。
鄭重宣告: 本文僅用於學習等目的。
分析
首先要爬取股票資料,肯定要先知道有哪些股票吧,這裡小編找到了一個網站,這個網站上有股票的編碼列表:https://hq.gucheng.com/gpdmylb.html 。
開啟 Chrome 的開發者模式,將股票程式碼一個一個選出來吧。具體過程小編就不貼了,各位同學自行實現。
我們可以將所有的股票程式碼存放在一個列表中,剩下的就是找一個網站,迴圈的去將每一隻股票的資料取出來咯。
這個網站小編已經找好了,是同花順,連結: http://stockpage.10jqka.com.cn/000001/ 。
想必各位聰明的同學已經發現了,這個連結中的 000001
就是股票程式碼。
我們接下來只需要拼接這個連結,就能源源不斷的獲取到我們想要的資料。
實戰
首先,還是先介紹一下本次實戰用到的請求庫和解析庫為: Requests 和 pyquery 。資料儲存最後還是落地在 Mysql 。
獲取股票程式碼列表
第一步當然是先構建股票程式碼列表咯,我們先定義一個方法:
def get_stock_list(stockListURL):
r =requests.get(stockListURL, headers = headers)
doc = PyQuery(r.text)
list = []
# 獲取所有 section 中 a 節點,並進行迭代
for i in doc('.stockTable a').items():
try:
href = i.attr.href
list.append(re.findall(r"\d{6}", href)[0])
except:
continue
list = [item.lower() for item in list] # 將爬取資訊轉換小寫
return list
將上面的連結當做引數傳入,大家可以自己執行下看下結果,小編這裡就不貼結果了,有點長。。。
獲取詳情資料
詳情的資料看起來好像是在頁面上的,但是,實際上並不在,實際最終獲取資料的地方並不是頁面,而是一個資料介面。
http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code=000001
至於是怎麼找出來,小編這次就不說,還是希望各位想學爬蟲的同學能自己動動手,去尋找一下,多找幾次,自然就摸到門路了。
現在資料介面有了,我們先看下返回的資料吧:
showStockDate({"info":{"000001":{"name":"\u5e73\u5b89\u94f6\u884c"}},"data":{"000001":{"10":"16.13","8":"16.14","9":"15.87","13":"78795234.00","19":"1262802470.00","7":"16.12","15":"40225508.00","14":"37528826.00","69":"17.73","70":"14.51","12":"5","17":"945400.00","264648":"0.010","199112":"0.062","1968584":"0.406","2034120":"9.939","1378761":"16.026","526792":"1.675","395720":"-948073.000","461256":"-39.763","3475914":"313014790000.000","1771976":"1.100","6":"16.12","11":""}}})
很明顯,這個結果並不是標準的 json 資料,但這個是 JSONP 返回的標準格式的資料,這裡我們先處理下頭尾,將它變成一個標準的 json 資料,再對照這頁面的資料進行解析,最後將分析好的值寫入資料庫中。
def getStockInfo(list, stockInfoURL):
count = 0
for stock in list:
try:
url = stockInfoURL stock
r = requests.get(url, headers=headers)
# 將獲取到的資料封裝進字典
dict1 = json.loads(r.text[14: int(len(r.text)) - 1])
print(dict1)
# 獲取字典中的資料構建寫入資料模版
insert_data = {
"code": stock,
"name": dict1['info'][stock]['name'],
"jinkai": dict1['data'][stock]['7'],
"chengjiaoliang": dict1['data'][stock]['13'],
"zhenfu": dict1['data'][stock]['526792'],
"zuigao": dict1['data'][stock]['8'],
"chengjiaoe": dict1['data'][stock]['19'],
"huanshou": dict1['data'][stock]['1968584'],
"zuidi": dict1['data'][stock]['9'],
"zuoshou": dict1['data'][stock]['6'],
"liutongshizhi": dict1['data'][stock]['3475914']
}
cursor.execute(sql_insert, insert_data)
conn.commit()
print(stock, ':寫入完成')
except:
print('寫入異常')
# 遇到錯誤繼續迴圈
continue
這裡我們加入異常處理,因為本次爬取的資料有些多,很有可能由於某些原因丟擲異常,我們當然不希望有異常的時候中斷資料抓取,所以這裡新增異常處理繼續抓取資料。
完整程式碼
我們將程式碼稍作封裝,完成本次的實戰。
import requests
import re
import json
from pyquery import PyQuery
import pymysql
# 資料庫連線
def connect():
conn = pymysql.connect(host='localhost',
port=3306,
user='root',
password='password',
database='test',
charset='utf8mb4')
# 獲取操作遊標
cursor = conn.cursor()
return {"conn": conn, "cursor": cursor}
connection = connect()
conn, cursor = connection['conn'], connection['cursor']
sql_insert = "insert into stock(code, name, jinkai, chengjiaoliang, zhenfu, zuigao, chengjiaoe, huanshou, zuidi, zuoshou, liutongshizhi, create_date) values (%(code)s, %(name)s, %(jinkai)s, %(chengjiaoliang)s, %(zhenfu)s, %(zuigao)s, %(chengjiaoe)s, %(huanshou)s, %(zuidi)s, %(zuoshou)s, %(liutongshizhi)s, now())"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
def get_stock_list(stockListURL):
r =requests.get(stockListURL, headers = headers)
doc = PyQuery(r.text)
list = []
# 獲取所有 section 中 a 節點,並進行迭代
for i in doc('.stockTable a').items():
try:
href = i.attr.href
list.append(re.findall(r"\d{6}", href)[0])
except:
continue
list = [item.lower() for item in list] # 將爬取資訊轉換小寫
return list
def getStockInfo(list, stockInfoURL):
count = 0
for stock in list:
try:
url = stockInfoURL stock
r = requests.get(url, headers=headers)
# 將獲取到的資料封裝進字典
dict1 = json.loads(r.text[14: int(len(r.text)) - 1])
print(dict1)
# 獲取字典中的資料構建寫入資料模版
insert_data = {
"code": stock,
"name": dict1['info'][stock]['name'],
"jinkai": dict1['data'][stock]['7'],
"chengjiaoliang": dict1['data'][stock]['13'],
"zhenfu": dict1['data'][stock]['526792'],
"zuigao": dict1['data'][stock]['8'],
"chengjiaoe": dict1['data'][stock]['19'],
"huanshou": dict1['data'][stock]['1968584'],
"zuidi": dict1['data'][stock]['9'],
"zuoshou": dict1['data'][stock]['6'],
"liutongshizhi": dict1['data'][stock]['3475914']
}
cursor.execute(sql_insert, insert_data)
conn.commit()
print(stock, ':寫入完成')
except:
print('寫入異常')
# 遇到錯誤繼續迴圈
continue
def main():
stock_list_url = 'https://hq.gucheng.com/gpdmylb.html'
stock_info_url = 'http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code='
list = get_stock_list(stock_list_url)
# list = ['601766']
getStockInfo(list, stock_info_url)
if __name__ == '__main__':
main()
成果
最終小編耗時 15 分鐘左右,成功抓取資料 4600 條,結果就不展示了。
示例程式碼
本系列的所有程式碼小編都會放在程式碼管理倉庫 Github 和 Gitee 上,方便大家取用。
相關文章
- Python爬蟲抓取股票資訊Python爬蟲
- 爬蟲之股票定向爬取爬蟲
- python爬蟲——爬取大學排名資訊Python爬蟲
- python爬蟲--爬取鏈家租房資訊Python爬蟲
- 【Python學習】爬蟲爬蟲爬蟲爬蟲~Python爬蟲
- Python爬蟲爬取淘寶,京東商品資訊Python爬蟲
- Python 爬蟲實戰(2):股票資料定向爬蟲Python爬蟲
- Python爬蟲實戰:爬取淘寶的商品資訊Python爬蟲
- Java爬蟲-爬取疫苗批次資訊Java爬蟲
- 小白學python-爬蟲常用庫Python爬蟲
- Python爬蟲學習筆記(1)爬取知乎使用者資訊Python爬蟲筆記
- python爬蟲---網頁爬蟲,圖片爬蟲,文章爬蟲,Python爬蟲爬取新聞網站新聞Python爬蟲網頁網站
- 小白如何學習Python網路爬蟲?Python爬蟲
- Python爬蟲學習(6): 爬取MM圖片Python爬蟲
- Python爬蟲學習(5): 簡單的爬取Python爬蟲
- python爬蟲58同城(多個資訊一次爬取)Python爬蟲
- python 爬蟲 爬取 learnku 精華文章Python爬蟲
- python爬蟲--招聘資訊Python爬蟲
- python爬蟲學習01--電子書爬取Python爬蟲
- Python爬蟲爬取美劇網站Python爬蟲網站
- python爬蟲爬取糗事百科Python爬蟲
- Python爬蟲之小說資訊爬取與資料視覺化分析Python爬蟲視覺化
- [python爬蟲] BeautifulSoup和Selenium簡單爬取知網資訊測試Python爬蟲
- 新手小白的爬蟲神器-無程式碼高效爬取資料爬蟲
- Python爬取股票資訊,並實現視覺化資料Python視覺化
- 分散式爬蟲之知乎使用者資訊爬取分散式爬蟲
- 爬蟲實戰(一):爬取微博使用者資訊爬蟲
- 爬蟲01:爬取豆瓣電影TOP 250基本資訊爬蟲
- [python爬蟲] 招聘資訊定時系統 (一).BeautifulSoup爬取資訊並儲存MySQLPython爬蟲MySql
- python爬蟲抓取哈爾濱天氣資訊(靜態爬蟲)Python爬蟲
- 【python爬蟲】python爬蟲demoPython爬蟲
- python 爬蟲 1 爬取酷狗音樂Python爬蟲
- python網路爬蟲--爬取淘寶聯盟Python爬蟲
- Python實現微博爬蟲,爬取新浪微博Python爬蟲
- Python爬蟲—爬取某網站圖片Python爬蟲網站
- 爬蟲——爬取貴陽房價(Python實現)爬蟲Python
- 【Python爬蟲】正則爬取趕集網Python爬蟲
- 利用Python爬蟲爬取天氣資料Python爬蟲