Как извлечь данные веб-страницы как можно быстрее?

#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()