同花順資料爬取

JJJhr發表於2024-06-27

請求獲取資料

import requests

url = 'https://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/'

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
}

response = requests.get(url=url, headers=headers)
html = response.text
print(html)

執行結果:

<html><body>
    <script type="text/javascript" src="//s.thsi.cn/js/chameleon/chameleon.min.1719332.js"></script> <script src="//s.thsi.cn/js/chameleon/chameleon.min.1719332.js" type="text/javascript"></script>
    <script language="javascript" type="text/javascript">
    window.location.href="//q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/";
    </script>
    </body></html>

結果中併為出現存在所要爬取的資料

思考:可能存在反爬

1、考慮請求頭資訊

2、存在加密可能

解決方法:1、請求頭中新增Cookie、Referer等後再次執行,問題解決

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'Cookie': 'v=Awcc3GskLeIF9alu7ByNVWQylrDUDNolNeJfetn1IU-9lCmu4dxrPkWw77Xq',
    'Referer': 'https://q.10jqka.com.cn/'
}

解析資料:

import parsel

response = requests.get(url=url, headers=headers)
html = response.text
selector = parsel.Selector(response.text)

# 提取所有tr標籤
data = selector.css('.m-table tr')[1:]
# print(data)
for i in data:
    info = i.css('td::text').getall()
    numberAndName = i.css('td a::text').getall()
    # print(numberAndName)
    # print(info)
    # 把資料儲存到字典裡
    dit = {
        '序號': info[0],
        '程式碼': numberAndName[0],
        '名稱': numberAndName[1],
        '現價': info[1],
        '漲跌幅(%)': info[2],
        '漲跌': info[3],
        '漲速(%)': info[4],
        '換手(%)': info[5],
        '量比': info[6],
        '振幅(%)' : info[7],
        '成交額': info[8],
        '流通股': info[9],
        '流通市值': info[10],
        '市盈率': info[11]
    }
    print(dit)

儲存資料

股票資料儲存為csv

import csv

# 建立檔案物件
f = open('stockInformation.txt', mode='w', encoding='utf-8', newline='')
# 字典寫入方法
csv_write = csv.DictWriter(f, fieldnames=[
    '序號',
    '程式碼',
    '名稱',
    '現價',
    '漲跌幅(%)',
    '漲跌',
    '漲速(%)',
    '換手(%)',
    '量比',
    '振幅(%)',
    '成交額',
    '流通股',
    '流通市值',
    '市盈率',
])
# 寫入表頭
csv_write.writeheader()

......

for i in data:
    ......
    # 寫入資料
    csv_write.writerow(dit)
......

執行結果:

翻頁爬取

分析請求連線的變化規律

https://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/1/ajax/1/
https://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/
https://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/3/ajax/1/

新增翻頁功能:

for page in range(1, 3):
    print(f'正在採集第{page}頁')
    url = f'https://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/{page}/ajax/1/'

   ......

        print(dit)

執行結果:

目標網址cookies會變化,可以使用使用 requests.Session() 來自動管理 cookies

    with requests.Session() as session:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
            # 不需要設定 'Cookie' 頭部,因為 Session 會自動處理
            'Referer': 'https://q.10jqka.com.cn/'
        }
        

相關文章