#python #web #web-scraping #beautifulsoup
#python #веб #веб-очистка #beautifulsoup
Вопрос:
Вот что я пытаюсь выполнить со страницы https://stellar.expert/explorer/public/asset/native?cursor=15297amp;filter=asset-holders
- извлеките данные из столбцов таблицы (учетная запись и баланс учетной записи)
- запишите извлеченные поля данных в текстовый файл.
- Я пытаюсь извлечь несколько страниц, например, от 15297 до 15500.
Я все еще новичок в python и веб-очистке, и я изо всех сил пытался получить желаемый результат. Помощь будет очень признательна. Спасибо.
from bs4 import BeautifulSoup
try:
import urllib.request as urllib2
except ImportError:
import urllib2
from time import sleep
url = 'https://stellar.expert/explorer/public/asset/native?cursor=15297amp;filter=asset-holders'
page = urllib2.urlopen((url))
soup = BeautifulSoup(page, 'html.parser')
for div in soup.find_all('div', attrs={'class': 'table exportable space'}):
address = div.find('tbody', attrs={'class': "account-address"})
address = address.text.strip()
print (address)
bal = div.find('tbody', attrs={'class': "text-right nowrap"})
bal = bal.text.strip()
print (balance)
print ("%s%sn" % ("page=", str(URL)))
Вывод, который я хотел записать (result.txt ):
GBMN2KIUQS66JMJHVOCA7N3S35F4F5PTY63XG3BJKKDMLPI4HPHA7QNU: 27,005 XLM
GBWVMIVJQNILFPHACV4Q7QM7VBOOQ35IQXEOOXO7WBXA4KX7OEADOU65: 27,004 XLM
GD3UXDHKS5EIKSL3PIG3NTVCCK5EQX73JMFJBFBROX3BAZ4K6437TZAC: 27,003 XLM
GBYUHMDQYNNDMJWOVODTZUKWOTVJXA2PCTDOF6J5NQS5DGMMJAL6B66L: 27,002 XLM
GDD3AQFXWWHWEFAOU4AWPZCT3Q6EVK4WYHWSG2EBQB3Z43KZSXJEK6WB: 27,001 XLM
Комментарии:
1. Страница загружена с помощью javascript, вы можете просмотреть страницу и посмотреть, есть ли у них api, если да, сделайте запрос на нее. Другим выходом было бы использовать selenium
2. Правильный термин — «очистка». Удаление означает выбрасывание.
Ответ №1:
Возможно, этот фрагмент кода может вам помочь.
Я просмотрел веб-страницу и увидел, что они используют api, отправил запрос на нее, и были возвращены нужные вам данные и ссылки на следующую и предыдущую страницы:
import requests
header = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:86.0Gecko/20100101 Firefox/86.0'}
req = requests.get(url='https://api.stellar.expert/explorer/public/asset/XLM/holders?cursor=15297amp;filter=asset-holdersamp;limit=50amp;order=asc', headers=header)
print(f"Previous page: {req.json()['_links']['prev']['href']}")
print(f"Next page: {req.json()['_links']['next']['href']}")
for dict_ in req.json()['_embedded']['records']:
print(dict_['account'], dict_['balance'])
Вы также можете получить доступ к URL-адресу в своем браузере, чтобы просмотреть данные
Комментарии:
1. Спасибо. Я просто не знаю, как получить нужные мне данные в текстовый файл, хотя при таком подходе.
2. Более подробный фрагмент был бы полезен, поскольку я действительно изо всех сил пытаюсь заставить это работать.
3. Я отредактировал ответ, посмотрите, можете ли вы теперь видеть данные. Удачи в ваших исследованиях.
4. Я попробовал этот подход, и он очень быстрый. Большое вам спасибо за фрагмент. Это мне очень помогает..
5. можете ли вы помочь мне в чем-то, что очищает poocoin.app / ape. Я попытался использовать фрагмент, который у вас есть, но я потерялся. Я хотел записать в текстовый файл все два столбца (токен, время создания).
Ответ №2:
Похоже, вы пытаетесь очистить динамически отображаемый контент. Для этого вы могли бы изучить возможность использования Selenium. Чтобы это решение работало, в частности, вам нужно будет перейти по этой ссылке, загрузить и установить WebDriver под названием geckodriver и сделать его доступным в вашем path.
from bs4 import BeautifulSoup
from selenium import webdriver
import urllib
import time
START_RANK = 15297
END_RANK = 15500
current_rank = START_RANK
file_name = 'result.txt'
base_url = 'stellar.expert'
path = 'explorer/public/asset/native'
driver = webdriver.Firefox()
with open(file_name, 'w') as f:
while current_rank <= END_RANK:
query_params = {'cursor': str(current_rank), 'filter': 'asset-holders'}
driver.get('https://{0}/{1}?{2}'.format(base_url, path,
'amp;'.join(f'{k}={v}' for k, v in query_params.items())))
# this is just to ensure that the page is loaded
time.sleep(10)
soup = BeautifulSoup(driver.page_source, 'html.parser')
table = soup.find('table', {'class': ['table', 'exportable', 'space']})
tbody = table.find('tbody')
for trow in tbody.find_all('tr', recursive=False):
pubkey = trow.find('span', attrs={'class': 'account-pubkey'})
balance = trow.find('span', attrs={'class': ['amount', 'nowrap']})
print(pubkey.text, balance.text, file=f)
current_rank = 1
if current_rank > END_RANK: break
Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
bs4 = "*"
selenium = "*"
[dev-packages]
[requires]
python_version = "3.9"
Комментарии:
1. Спасибо. Я попробовал этот подход. Установлены Selenium и webdriver. Запускаю точно такой же код, который у вас есть, и получаю ошибку: трассировка (последний последний вызов): File «C:Python38Stellar Scapper.py «, строка 25, в <module> tbody = table.find(‘tbody’) Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘find’
2. Я проверил на своем конце и сравнил пакеты. Единственное отличие — мой chardet == 3.0.4. Все остальные такие же, как у вас. Однако я использую python 3.8.
3. Я добавил файл PIpfile выше, если вы хотите создать виртуальную среду с использованием pipenv, чтобы проверить мое решение
4. Спасибо. Я заставил его работать, изменив эту часть — tbody = soup.find(‘tbody’) . Как я могу заставить скрипт запускаться с 15297 до, скажем, 15500? stellar.expert/ explorer / public / asset / … — stellar.expert/ explorer/ public /asset / …
5. Для этого вам потребуется обновить курсор в строке запроса URL-адреса и выполнить другой запрос. Я переработал свое первоначальное решение для выполнения дополнительных запросов.