#python #web-scraping #selenium-chromedriver
Вопрос:
Я хотел бы прочитать более 100 транзакций, но проблема в том, что это очень медленно и, похоже, неэффективно для более длинного списка транзакций. Я добавил код для одной транзакции. Он создает объект браузера, загружает страницу и затем читает, что отнимает много времени. Существует ли какой-либо эффективный способ чтения некоторого содержимого страницы?
from selenium import webdriver
PATH = 'C:/Users/.../Desktop/Py/chromedriver.exe'
# A list of all transactions, only one transaction
transactions = ['0x483250bcd0d94becc904446a0aac44d55e4f8084a4a5bfd928934507196aed83']
for trans in transactions:
driver = webdriver.Chrome(PATH)
driver.get('https://bscscan.com/tx/' trans) # buying Safemoon
nRows = int(driver.find_element_by_xpath('//*[@id="ContentPlaceHolder1_maintable"]/div[7]/div[1]/div/span[2]').text)
for row in range(1,nRows 1):
myText = driver.find_element_by_xpath(f'//*[@id="wrapperContent"]/li[{row}]/div/span[6]').text
print(myText)
driver.quit()
Ответ №1:
У вас есть много вариантов, Scrapy-один из них, Beautifulsoup-еще одна работающая библиотека, даже вы можете проверять запросы, выполняемые браузером на каждой странице, и пытаться отвечать http-запросами
Комментарии:
1. можно ли преобразовать приведенный выше код, как вы упомянули? Какой из предложенных вариантов не открывает окно браузера и все равно получает содержимое страницы?
2. Beautifulsoup и Scrapy, посмотрите на примеры кодов, и вы сможете решить, какой код выглядит более читабельным, затем вы можете выбрать один, потому что вы все равно можете искать по xpath в обоих, поэтому в запросах вы можете это делать, но это не их ядро.
Ответ №2:
Я попытался, как было предложено выше, но все равно получаю неправильный ответ. Переменная lines
должна выводить 2, но она выводит 3. Следовательно, myText
переменная пуста.
Вот моя попытка:
import requests
from lxml import html
trx = '0x3ed5c38e21efe13491f5518ffccc972e9884e1ff7f5bc9d4b80ee114e3d77dc1'
page = requests.get("https://bscscan.com/tx/" trx)
tree = html.fromstring(page.content)
lines = len(tree.xpath('//*[@id="wrapperContent"]'))
print(lines)
myText = tree.xpath(f'//*[@id="wrapperContent"]/li[{lines}]/div/span[6]/span/text()')
print(myText)
Ответ №3:
Скрапы или запросы с многопоточностью могут обрабатывать 100 транзакций за считанные секунды
В приведенном выше коде измените это, чтобы увеличить скорость выполнения
from selenium import webdriver
PATH = 'C:/Users/.../Desktop/Py/chromedriver.exe'
# A list of all transactions, only one transaction
transactions = ['0x483250bcd0d94becc904446a0aac44d55e4f8084a4a5bfd928934507196aed83']
driver = webdriver.Chrome(PATH)
for trans in transactions:
driver.get('https://bscscan.com/tx/' trans) # buying Safemoon
nRows = int(driver.find_element_by_xpath('//*[@id="ContentPlaceHolder1_maintable"]/div[7]/div[1]/div/span[2]').text)
for row in range(1,nRows 1):
myText = driver.find_element_by_xpath(f'//*[@id="wrapperContent"]/li[{row}]/div/span[6]').text
print(myText)
driver.quit()