介绍

如果我们用Requests库采集一些大型电商网站的页面,可能会发现一个令人疑惑的现象:对于同一个URL,同一个页面,我们抓取到的内容与我们在浏览器中看到的内容有所不同,这是因为,我们通过程序获得的是原始的HTTP内容,但浏览器中的页面其实是在此基础上,经过Javascript进一步加工和处理后生成的效果,然后,再嵌入到原始的HTML中,呈现给用户。这种AJAX网页开发技术是当前主流的网页开发技术。

本次的任务是爬取和讯网的开放式基金排名页面最近6页的基金编号、基金名称、基金净值和基金链接等4项信息,保存到SQLITE3数据库fund.db的tbl_fund数据表中。

代码

import requests
import json
import sqlite3

def insert_fund_data(fundcode, fundname, tnet, fundlink):
    with sqlite3.connect('fund.db') as conn:
        cur = conn.cursor()
        cur.execute('''
            CREATE TABLE IF NOT EXISTS tbl_fund (
                ID INTEGER PRIMARY KEY NOT NULL,
                fundNAME TEXT NOT NULL,
                fundCODE TEXT NOT NULL,
                tNet REAL,
                fundLINK TEXT
            );
        ''')
        conn.commit()

        # 插入数据
        cur.execute("INSERT INTO tbl_fund (fundcode, fundname, tnet, fundlink) VALUES (?,?,?,?)", (fundcode, fundname, tnet, fundlink))
        conn.commit()

def geturl(url):
    res = requests.post(url)
    # JSON字符串
    json_data = res.text
    # 提取 JSON 部分
    start_index = json_data.find('(') + 1
    end_index = json_data.rfind(')')
    json_data = json_data[start_index:end_index]

    data = json.loads(json_data)
    print("基金列表:")
    for fund in data["list"]:
        print(fund["fundCode"],"-",fund["fundName"],"-",fund["tNet"],"-",fund["fundLink"])
        insert_fund_data(fund["fundCode"], fund["fundName"], fund["tNet"], fund["fundLink"])

if __name__ == "__main__":
    for i in range(1, 7):
        url = f'https://jingzhifunds.hexun.com/jz/JsonData/KaifangJingz.aspx?callback=callback&curpage={i}&pagesize=20'
        geturl(url)

效果

2023-12-06T15:20:22.png
2023-12-06T15:21:20.png


声明

未经所有者同意,请不要攻击网站。
本人所有文章均为技术分享,均用于防御为目的的记录,所有操作均在实验环境下进行,请勿用于其他用途,否则后果自负。
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

文章目录