Веб-очистка Python не может извлечь данные таблицы, которые я хотел

#python #web #web-scraping #beautifulsoup

#python #веб #веб-очистка #beautifulsoup

Вопрос:

Вот что я пытаюсь выполнить со страницы https://stellar.expert/explorer/public/asset/native?cursor=15297amp;filter=asset-holders

  1. извлеките данные из столбцов таблицы (учетная запись и баланс учетной записи)
  2. запишите извлеченные поля данных в текстовый файл.
  3. Я пытаюсь извлечь несколько страниц, например, от 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-адреса и выполнить другой запрос. Я переработал свое первоначальное решение для выполнения дополнительных запросов.