Поисковый робот Python — получить информацию об изменении фонда

Python
Поисковый робот Python — получить информацию об изменении фонда

Это 3-й день моего участия в ноябрьском испытании обновлений, узнайте подробности события:Вызов последнего обновления 2021 г.

Если вы потеряете свою человечность, вы потеряете многое, если вы потеряете свою зоофилию, вы потеряете все.

1. Введение

Мы уже представили, как получить список фондов и как получить основную информацию о фонде.Сегодня мы продолжим предыдущее содержание и получим информацию об изменениях в фонде. Способ получения информации на этот раз будет представлять собой комбинацию парсинга данных страницы и вызовов интерфейса API.

2 Получить информацию об изменении

Наблюдая за страницей основной информации о фонде, мы можем обнаружить, что страница с информацией об изменении фонда может содержать следующие 4 части:

1-基金页面头部的信息

Далее, давайте поговорим о нашей идее сбора данных, На первом изображении мы получили основную информацию о фонде, информацию об изменении и повышении стадии, но на втором изображении показано увеличение стадии. , поэтому на этом рисунке нам нужно только получить рост и падение в реальном времени и чистую стоимость фонда в предыдущий день.

2.1 Получение информации об изменении фонда
# 基金的变动信息,我们还是从一个简单的连接开始,其他基金的获取方式是和这个类似,
# 访问地址换上其他的基金代码即可。
http://fund.eastmoney.com/005585.html

Получение изменений здесь разделено на две части. Одна часть заключается в получении изменений фонда в режиме реального времени. Будет обнаружено, что оценка чистой стоимости изменится через определенный период времени. Путем мониторинга записи запроса доступа Браузер, такой доступ к апи фиксируется, и это мгновенное удовольствие.

// http://fundgz.1234567.com.cn/js/005585.js
{
	'fundcode': '005585',
	'name': '银河文体娱乐混合',
	'jzrq': '2021-11-16',
	'dwjz': '1.6718',
	'gsz': '1.6732',
	'gszzl': '0.08',
	'gztime': '2021-11-17 15:00'
}

Код фонда и название фонда можно узнать по содержимому, возвращаемому json, ноjzrq,dwjz,gsz,gszzl,gztimeЧто это значит?Я долго внимательно изучал его, в сочетании с отображаемым на странице контентом, плюс привычка кодировать первую букву китайского пиньинь с помощью dfcf, думаю смысл этих полей примерно净值日期、单位净值、估算值、估算增长率、估算时间. Я был немного самодовольным, и я действительно разгадал тайну.

Вторая часть состоит в том, чтобы получить чистую стоимость единицы фонда.Путем анализа выясняется, что данные содержатся в<dl class="dataItem02">В элементе html мы получаем его, анализируя возвращенную информацию о странице с помощью bs4, чтобы получить элемент и анализировать дерево dom, чтобы получить его.

Подводя итог, мы получаем информацию об изменениях фонда в режиме реального времени через вызовы интерфейса API и получаем информацию о чистой стоимости единицы фонда, анализируя возвращенный html и анализируя дерево dom. Ниже приведен код для первой части очистки информации.

# 抓取基金实时变动信息
resp = requests.get("http://fundgz.1234567.com.cn/js/{}.js".format(code))
# 去除js的呢绒方便进行数据的json转化
data = resp.text.replace("jsonpgz(", "").replace(");", "")
body = json.loads(data)
# 输出获取到的结果数据
print("{} {} 估算值 {} 估算涨跌 {} 估算时间 {}".format(body["fundcode"], body["name"], body["gsz"], body["gszzl"], body["gztime"]))

# 请求获取基金页面的信息
response = requests.get("http://fund.eastmoney.com/{}.html".format(code))
# 打印原始的请求返回报文编码方式
# print(response.apparent_encoding)
# 设置请求的返回内容编码方式,避免出现控制台乱码的情况
response.encoding = "UTF-8"
resp_body = response.text
# 进行数据的转换和解析
soup = BeautifulSoup(resp_body, 'lxml')
# 因为确定了只有一个元素,因此可以使用 find 发放来获取数据,这个就是查找 dl标签,class=dataItem02 的元素
dl_con = soup.find("dl", class_="dataItem02")

# 获取基金净值的更新时间
value_date = dl_con.find("p").get_text()
# 只提取基金数据的时间即可
value_date = value_date.replace("单位净值", "").replace("(", "").replace(")", "")
# 净值数据和涨跌百分比数据是在dd标签下的两个p标签中
value_con = dl_con.find("dd", class_="dataNums")
data_list = value_con.find_all("span")
val_data = data_list[0].get_text()
per_data = data_list[1].get_text()
print("基金净值日期 {} 净值数据 {} 涨跌百分比 {}".format(value_date, val_data, per_data))

Наконец, с помощью вышеуказанных операций мы можем получить информацию об изменениях в фонде.

2.2 Сбор информации об этапах фонда

Сбор информации об этапах фонда также управляется данными страницы синтаксического анализа bs4. Здесь есть три графика. Первый график показывает взлеты и падения этапа, а второй и третий — ежеквартальные и годовые приросты. В конце нам нужно отформатировать хранилище.Для первого графика мы можем хранить его в режиме структурированных строк, который может отображать ежедневные изменения, но для второго и третьего нам нужно использовать хранилище в режиме столбца, как своего рода статистику запросов. Поскольку методы анализа двух методов различаются, поле заголовка на первом изображении существует как поле в базе данных, поэтому нам не нужно заботиться, второму и третьему необходимо получить заголовок таблицы для хранения, и статистические события также хранятся нами данные. Кроме того, нам необходимо получить не только базовую информацию о фонде, но и соответствующую информацию CSI 300, которую удобно использовать в качестве индикатора силы для сравнительного суждения при скрининге, поэтому данные CSI 300 также нужны. быть захваченным.Часть операции несложная, в основном в плане анализа полученных данных и последующего хранения идей.

2-基金的阶段涨幅

3-基金的季度涨幅

4-基金的年度涨幅

Я здесь, чтобы напрямую получить все элементы таблицы на странице, затем зациклить результаты вывода, а затем получить данные, которые необходимо получить по этому индексу. Здесь я вставлю код непосредственно для иллюстрации:

# 打印表格
def print_table(head, body):
    tb = PrettyTable()  # 生成表格对象
    tb.field_names = head  # 定义表头
    tb.add_row(body)
    print(tb)
# 查询季度 年度数据
def query_year_quarter(data_list, num):
    stage_list = data_list.find_all("tr")[0].find_all("th")
    head_list = []
    for nd in stage_list:
        val = nd.get_text().strip()
        val = val.replace("季度", "").replace("年度", "").replace("年", "-")
        if val:
            # print(nd.get_text())
            head_list.append(val)

    body_list = []
    stage_list = data_list.find_all("tr")[num].find_all("td")
    for nd in stage_list:
        val = nd.get_text()
        if "阶段涨幅" in val or "沪深300" in val:
            continue
        body_list.append(val.replace("%", ""))

    # 打印表格
    print_table(head_list, body_list)    

# 获取基金基本信息这里只是贴了部分代码,需要把获取净值部分的信息进行组合才能够运行
def query_fund_basic(code="005585", hsFlag=False):
    # 阶段涨幅表头
    stage_head_list = ["stage_week", "stage_month", "stage_month3", "stage_month6", "stage_year", "stage_year1","stage_year2", "stage_year3", ]
    stage_list = body_list[11].find_all("tr")
    # 获取第2个是基金情况 获取第4个是hs300情况
    num = 1
    if hsFlag:
        num = 3
    tmp_list = []
    for nd in stage_list[num].find_all("td"):
        val = nd.get_text()
        if "阶段涨幅" in val or "沪深300" in val:
             continue
        tmp_list.append(val.replace("%", ""))

    # 打印阶段幅度表格
    print("\t------阶段涨跌------")
    print_table(stage_head_list, tmp_list)

    print("\t------季度涨跌------")
    query_year_quarter(body_list[12], num)
    print("\t------年度涨跌------")
    query_year_quarter(body_list[13], num)

3 Отображается окончательный результат

Из-за ограниченного места код не будет отображаться в этой статье, я буду поддерживать контент на github и предоставлять его в будущем.

基金净值信息结果

基金最终输出结果

HS300最终输出结果