【问题标题】:How to extract webpage data as quick as possible?如何尽可能快地提取网页数据?
【发布时间】:2021-10-26 03:09:06
【问题描述】:

我想读取超过 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()

【问题讨论】:

    标签: python web-scraping selenium-chromedriver


    【解决方案1】:

    你有很多选择,Scrapy 是其中之一,Beautifulsoup 是另一个可以工作的库,甚至你可以检查浏览器完成的请求每个页面并尝试用 http Requests

    回复

    【讨论】:

    • 是否可以按照您所说的转换上述代码?哪个建议选项不会打开浏览器窗口并仍然获取页面内容?
    • 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】:

      Scrapy 或多线程请求都可以在几秒钟内处理 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() 
      

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 2011-10-23
        • 2016-04-16
        • 2013-06-28
        • 1970-01-01
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多