Nano Hash - криптовалюты, майнинг, программирование

Циклические страницы и сохранение содержимого в файле Excel с веб-сайта в Python

Я пытаюсь зациклить страницы из этого ссылка и извлеките интересующую часть.

Пожалуйста, смотрите содержимое в красном кружке на изображении ниже.

введите здесь описание изображения

Вот что я пробовал:

url = 'http://so.eastmoney.com/Ann/s?keyword=购买物业&pageindex={}'
for page in range(10):
    r = requests.get(url.format(page))
    soup = BeautifulSoup(r.content, "html.parser")
    print(soup)

xpath для каждого элемента (может быть полезно для тех, кто не читает по-китайски):

/html/body/div[3]/div/div[2]/div[2]/div[3]/h3/span  --> 【润华物业】
/html/body/div[3]/div/div[2]/div[2]/div[3]/h3/a --> 润华物业:关于公司购买理财产品的公告
/html/body/div[3]/div/div[2]/div[2]/div[3]/p/label --> 2017-04-24
/html/body/div[3]/div/div[2]/div[2]/div[3]/p/span --> 公告编号:2017-019 证券代码:836007 证券简称:润华物业  主办券商:国联证券
/html/body/div[3]/div/div[2]/div[2]/div[3]/a --> http://data.eastmoney.com/notices/detail/836007/AN201704250530124271,JWU2JWI2JWE2JWU1JThkJThlJWU3JTg5JWE5JWU0JWI4JTlh.html

Мне нужно сохранить вывод в файл Excel. Как я мог сделать это в Python? Большое спасибо.


Ответы:


1

BeautifulSoup не увидит этот материал, поскольку он динамически обрабатывается JS, но есть конечная точка API, которую вы можете запросить, чтобы получить то, что вам нужно.

Вот как:

import requests
import pandas as pd


def clean_up(text: str) -> str:
    return text.replace('</em>', '').replace(':<em>', '').replace('<em>', '')


def get_data(page_number: int) -> dict:
    url = f"http://searchapi.eastmoney.com/business/Web/GetSearchList?type=401&pageindex={page_number}&pagesize=10&keyword=购买物业&name=normal"
    headers = {
        "Referer": f"http://so.eastmoney.com/Ann/s?keyword=%E8%B4%AD%E4%B9%B0%E7%89%A9%E4%B8%9A&pageindex={page_number}",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:83.0) Gecko/20100101 Firefox/83.0",
    }
    return requests.get(url, headers=headers).json()


def parse_response(response: dict) -> list:
    for item in response["Data"]:
        title = clean_up(item['NoticeTitle'])
        date = item['NoticeDate']
        url = item['Url']
        notice_content = clean_up(" ".join(item['NoticeContent'].split()))
        company_name = item['SecurityFullName']
        print(f"{company_name} - {title} - {date}")
        yield [title, url, date, company_name, notice_content]


def save_results(parsed_response: list):
    df = pd.DataFrame(
        parsed_response,
        columns=['title', 'url', 'date', 'company_name', 'content'],
    )
    df.to_excel("test_output.xlsx", index=False)


if __name__ == "__main__":
    output = []
    for page in range(1, 11):
        for parsed_row in parse_response(get_data(page)):
            output.append(parsed_row)

    save_results(output)

Это выводит:

栖霞物业购买资产的公告 - 2019-09-03 16:00:00 - 871792
索克物业购买资产的公告 - 2020-08-17 00:00:00 - 832816
中都物业购买股权的公告 - 2019-12-09 16:00:00 - 872955
开元物业:开元物业购买银行理财产品的公告 - 2015-05-21 16:00:00 - 831971
开元物业:开元物业购买银行理财产品的公告 - 2015-04-12 16:00:00 - 831971
盛全物业:拟购买房产的公告 - 2017-10-30 16:00:00 - 834070
润华物业购买资产暨关联交易公告 - 2016-08-23 16:00:00 - 836007
润华物业购买资产暨关联交易公告 - 2017-08-14 16:00:00 - 836007
萃华珠宝:关于拟购买物业并签署购买意向协议的公告 - 2017-07-10 16:00:00 - 002731
赛意信息:关于购买办公物业的公告 - 2020-12-02 00:00:00 - 300687

И сохраняет это в файл .csv, который легко обрабатывается Excel.

введите здесь описание изображения

PS. Я не знаю китайского (?), поэтому вам придется изучить содержание ответа и выбрать больше материала.

02.12.2020
  • Я искал это, но не мог найти. Где вы нашли URL-адрес API? 02.12.2020
  • @ chitown88 это в Инструментах разработчика -> Сеть -> Другое, и это тот, у которого GetSearchList инициирован jquery. Если вы удалите параметр jquery из URL-адреса, вы получите чистый ответ JSON. 02.12.2020
  • Ах хорошо. Я понимаю. Я не проверял под Other 02.12.2020
  • Спасибо за вашу помощь. Я также обновил xpath для каждого элемента, если это уместно. 02.12.2020
  • Я обновил ответ. Вы можете настроить for loop для разбиения страниц на страницы, если хотите. 02.12.2020
  • Отличный код, большое спасибо, я также пробовал циклические страницы, но это не работает, потому что я не передал page в url и headers, пожалуйста, проверьте решение ниже. 02.12.2020
  • Не могли бы вы переписать и добавить функцию save_results, сохранив результат с кадром данных pandas? Кстати, что представляет собой -> в вашем коде? 02.12.2020
  • @ahbon Я обновил ответ. Этот -> str указывает тип возвращаемого значения. 03.12.2020
  • Основываясь на этом вопросе, я задаю новый вопрос stackoverflow.com/questions/65176880/, если у вас есть время, проверьте, большое спасибо. 07.12.2020

  • 2

    Обновленный ответ, основанный на решении @baduker, но не работает для циклических страниц.

    import requests
    import pandas as pd
    
    for page in range(10):
        url = "http://searchapi.eastmoney.com/business/Web/GetSearchList?type=401&pageindex={}&pagesize=10&keyword=购买物业&name=normal"
        headers = {
            "Referer": "http://so.eastmoney.com/Ann/s?keyword=%E8%B4%AD%E4%B9%B0%E7%89%A9%E4%B8%9A&pageindex={}",
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:83.0) Gecko/20100101 Firefox/83.0",
        }
        
        response = requests.get(url, headers=headers).json()
        
        output_data = []
        for item in response["Data"]:
            # print(item)
            # print('*' * 40)
            title = item['NoticeTitle'].replace('</em>', '').replace(':<em>', '').replace('<em>', '')
            url = item['Url']
            date = item['NoticeDate'].split(' ')[0]
            company_name = item['SecurityFullName']
            content = item['NoticeContent'].replace('</em>', '').replace(':<em>', '').replace('<em>', '')
            # url_code = item['Url'].split('/')[5]
            output_data.append([title, url, date, company_name, content])
    
    names = ['title', 'url', 'date', 'company_name', 'content']
    df = pd.DataFrame(output_data, columns = names)
    df.to_excel('test.xlsx', index = False)
    
    02.12.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..