Выборка из списка на питоне (юпитер ноутбук)
Объясняю задачку. Имеем список адресов input.txt - нужно через страницу выбрать только рабочие адреса.
Для этого, берем первый стринг из списка, подставляем в адрес, грузим страницу, парсим на наличие класса "search-result-list", если на странице отсутствует - цикл продолжается, если есть - записываем этот адрес в output.txt и так проходим весь список.
Желательно конечно влепить рандомную задержку как в этом примере: ютуб, скрипт к видео.
Пример списка input.txt:
0x0000000012300000000000000000000000000000
0x0000000001230000000000000000000000000000
0x0000000000012300000000000000000000000000
0x0000000000001230000000000000000000000000
0x0000000000000123000000000000000000000000
0x0000000000000012300000000000000000000000
0x0000000000000000000000000000000000000000
0x0000000000000000012300000000000000000000
0x0000000000000000001230000000000000000000
0x0000000000000000000000000000000000000001
(седьмой и десятый адрес должен записаться в список)
тут ещё больше примеров от индуса: ютуб
import requests
import bs4
from bs4 import BeautifulSoup
url = 'https://blockscan.com/address/0x0123000000000000000000000000000000000000'
headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" }
data = requests.get(url)
print(data.text)

import requests import urllib.parse from bs4 import BeautifulSoup import os INPUT_FILE = "input.txt" OUTPUT_FILE = "output.txt" MIN_DELAY = 1 MAX_DELAY = 5 URL_TEMPLATE = 'https://blockscan.com/address/{address}' HEADERS = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"} def writeToFile(address): with open(OUTPUT_FILE, 'a') as file: file.write(address) def checkAddress(address): print(address) url = URL_TEMPLATE.format(address=urllib.parse.quote(address)) print(url) r = requests.get(url, headers=HEADERS) r.raise_for_status() soup = BeautifulSoup(r.text, 'html.parser') if soup.find(class_="search-result-list") is not None : writeToFile(address + os.linesep) if __name__ == '__main__': with open(INPUT_FILE) as file: addresses = file.readlines() for address in addresses: time.sleep(MIN_DELAY + random.random() * (MAX_DELAY - MIN_DELAY)) checkAddress(address.rstrip())
Тесты делали тоже в юпитере?
Если использовать Вашу программу сейчас без исправлений - то юпитер ругается, сначала одно, потом другое:
NameError: name 'time' is not defined
NameError: name 'random' is not defined
Вероятно Вы подгружали библиотеки первый раз, потом удалили, но дело в том что "ячейка" хранит библиотеки в памяти и может обращаться к ним до перезагрузки ядра.
я добавил пару библиотек и пару убрал:
import requests
import urllib.parse
from bs4 import BeautifulSoup
import time
import random
убрал io и os добавил time и random
поменял строку
writeToFile(address + os.linesep) # вставляет пустую строку разделитель
на строку
writeToFile(address + "\n") # новая строка, более компактно
теперь программа работает, очень хорошо, уже прогнал на проверку несколько тысяч адресов, большое спасибо.
