#python-3.x #xpath #web-scraping #beautifulsoup #python-requests
#python-3.x #xpath #очистка веб-страниц #beautifulsoup #python-запросы
Вопрос:
Я пытаюсь зациклить страницы по этой ссылке и извлечь интересную часть.
Пожалуйста, посмотрите содержимое в красном кружке на изображении ниже.
Вот что я пробовал:
url = 'http://so.eastmoney.com/Ann/s?keyword=购买物业amp;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=401amp;pageindex={page_number}amp;pagesize=10amp;keyword=购买物业amp;name=normal"
headers = {
"Referer": f"http://so.eastmoney.com/Ann/s?keyword=购买物业amp;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. Я не знаю китайского (?), Поэтому вам придется изучить содержимое ответа и выбрать больше материала.
Комментарии:
1. Я искал это, но не смог найти. Где вы нашли URL-адрес API?
2. @chitown88 это в инструменте разработчика -> Сеть -> Другое, и это тот
GetSearchList
, который инициирован jquery. Если вы удалите параметр jquery из URL-адреса, вы получите чистый JSON-ответ.3. хорошо. Я вижу. Я не проверял под
Other
4. Я обновил ответ. При желании вы можете настроить a
for loop
для «разбиения на страницы» по страницам.5. @ahbon я обновил ответ. Это
-> str
указывает тип возвращаемого значения.
Ответ №2:
Обновленный ответ, основанный на решении @baduker, но не работающий для страниц цикла.
import requests
import pandas as pd
for page in range(10):
url = "http://searchapi.eastmoney.com/business/Web/GetSearchList?type=401amp;pageindex={}amp;pagesize=10amp;keyword=购买物业amp;name=normal"
headers = {
"Referer": "http://so.eastmoney.com/Ann/s?keyword=购买物业amp;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)