当前位置: 首页 > 知识库问答 >
问题:

加速用硒刮网

史懿轩
2023-03-14

我是使用selenium进行网络抓取的新手,我正在抓取SeeTicket。我们的刮刀工作原理如下。

    < li >登录 < li >搜索事件 < li >单击每个事件 < li >收集数据 回来吧 < li >单击下一个事件 < li >重复

现在的问题是,某些事件不包含某些元素,例如此事件:https://wl.seetickets.us/event/Beta-Hi-Fi/484490?afflky=WorldCafeLive

其中不包含定价表,但此表包含

https://www.seetickets.us/event/Wake-Up-Daisy-1100AM/477633

所以我使用了尝试,除了块

try:
   find element 
except:
   return none

但是如果它在try中没有找到元素,则需要5秒才能转到,除非因为我使用了

webdriver.implicitwait(5)

现在,如果任何页面不包含多个元素,selenium会花费大量时间来抓取该页面。

我有数千页要刮。应该做些什么来加快这一进程。

谢谢

共有3个答案

宋志学
2023-03-14

而不是使用 implicitWait 并等待每个单独的元素,只需等待满页加载,例如等待 h1 标记,这将指示已加载整个页面,然后继续提取。

#wait for page load
try:
    pageLoadCheck=WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, "(//h1)[1]"))).get_attribute("textContent").strip()

#extract data without any wait once the page is loaded
   try:
       dataOne=driver.find_element_by_xpath("((//h1/following-sibling::div)[1]//a[contains(@href,'tel:')])[1]").get_attribute("textContent").strip()
   except:
        dataOne=''

except Exception as e:
    print(e)
太叔逸春
2023-03-14

尝试使用显式等待,而不是隐式等待,而是将其应用于搜索主容器以等待内容加载。对于所有内部元素,应用find_element,无需等待。

附言:分享你的真实代码而不是伪代码总是更好的。

太叔鸿博
2023-03-14

要使用硒加速卷筒纸刮擦:

  • 完全去掉隐等待()。
  • 针对以下任一元素状态,诱导WebDriver等待将webDrive实例与WebBrowser实例同步:
    • presence_of_element_located()
    • visibility_of_element_located()
    • element_to_be_clickable()

    您的有效代码块将是:

    try:
       element = WebDriverWait(driver, 3).until(EC.visibility_of_element_located((By.ID, "input")))) 
       print("Element is visible")
    except TimeoutException:
       print("Element is not visible")
    

    注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

 类似资料:
  • 我是selenium的新手,正在尝试一个需要从页面中抓取URL的项目。 来源:-https://www.autofurnish.com/audi-car-accessories 我想搜集数据以获取这些产品的URL。我能够完成它,但面临滚动部分的问题。我需要抓取这个页面上所有产品的所有URL。这是一个巨大的页面,有很多结果。 我尝试过:- 1. 我试过这个代码,但它只是向下滚动到最后,所有的产品都没

  • 所以我想在速卖通上把一个产品的价格刮下来。我试着检查这个元素 null null 我正在尝试运行以下代码 ''' '''但我一直得到一个空输出。我一定是做错了什么,但这些方法似乎在我看到的教程中起作用。

  • 问题内容: 到目前为止,我一直只使用scrapy并编写自定义类来使用ajax处理网站。 但是,如果我要使用scrapy-splash,据我所知,它会在javascript之后刮擦呈现的html,那么对我的抓取工具的速度会产生重大影响吗? 用scrapy刮擦香草html页面与使用scrapy-splash渲染javascript html所花费的时间之间的比较是什么? 最后,scrapy-splas

  • 我需要刮http://www.vintagetoday.be/fr/montres但它有动态内容。 我该怎么做呢? 从bs4导入请求导入美丽汤t=requests.get("vintagetoday.be/fr/catalogue.awp"). text print(len(美丽汤(t,"lxml"). findAll("td",{"class":"Lien2"}))

  • 问题内容: 我正尝试在此网站上搜索selenium表中的清单。我是新手,并编写了以下代码: 但是,我可以获取以下标签,但不能获取其中的数据。 我以前也尝试过BS4进行刮擦,但失败了。任何帮助深表感谢。 问题答案: 该 结果是在一个iframe -切换到它,然后得到: 我还要添加一个等待表加载的方法:

  • 实现一个刮刮乐的刮奖效果。即用手指滑动刮奖区,会刮去上面一层视图,显示下面一层视图的内容。 [Code4App.com]