优化大量滚动和高内容负载页面的抓取策略

Optimizing Scraping Strategy for Pages with Extensive Scrolling and High Content Load

提问人:Saint-malo 提问时间:11/9/2023 最后编辑:Saint-malo 更新时间:11/10/2023 访问量:37

问:

我正在尝试通过结构为“https://www.facebook.com/media_name/videos”的 URL 从 Facebook 上的各种媒体中抓取视频。该过程涉及滚动浏览包含很长视频列表的页面(直到没有新视频时)。这种策略在采用动态加载的 Instagram 上效果很好;然而,在Facebook上,每次滚动似乎都会触发整个页面的完整更新。

对于包含大量视频(例如 5,000 个)的页面,滚动会更新所有容器(观看次数、点赞次数、时间戳等),从而导致加载时间过长。经过大约 5 个小时的抓取,我的脚本停止了,因为有 4,000 多个视频,每次滚动大约需要 10 分钟才能刷新一整页。我在 Python 中使用 Selenium,使用没有无头模式且没有与 Facebook 建立连接的 Chrome WebDriver。

有没有办法添加 Chrome 扩展程序、修改 Chrome 设置或实施任何可能阻止整个页面在每次滚动时刷新的解决方案?我正在寻找一种更有效的抓取方法,而无需连续重新加载所有内容。

这是我的代码,它对于像 Instagram 这样的页面非常有效,但对于 Facebook 来说表现不佳:

def scrolldown(driver,times):
    last_height = driver.execute_script("return document.body.scrollHeight")
    for i in range(times) : 
         driver.execute_script("window.scrollTo(0, 
                   document.body.scrollHeight);")
         time.sleep(0.1)
         new_height = driver.execute_script("return 
                        document.body.scrollHeight")
         if new_height == last_height:
             break  


media_name = "brutofficiel"  #for example 
URL =  "https://www.facebook.com/" + media_name + "/videos" 

# Access to the page then start scroll 
service = Service()
options = Options()
options.add_argument("--disable-extensions")
options.add_argument("--disable-blink- 
      features=AutomationControlled")
driver = webdriver.Chrome(service=service,options=options)
driver.get(URL) 
close_cookie_connection_fb(driver) 

Data_scraping = {}
Data_scraping["data_video"] = {}
max_consecutiv_attempt_block = 30
attempts_block   = 0
dico_return_data = {} 
soup = BeautifulSoup(driver.page_source, "html.parser")  
soup_page = soup.find("div", {"class":"x1pi30zi 
      x1swvt13"}).find_all("div" , {"class":"x9f619 x1r8uery 
     x1iyjqo2 x6ikm8r x10wlt62 x1n2onr6"})
new_dico_page2 = scrap_reel_page(soup_page) 
dico_return_data = {**dico_return_data,**new_dico_page2}
while (attempts_block < max_consecutiv_attempt_block):
    soup = BeautifulSoup(driver.page_source, "html.parser")  
    soup_page = soup.find("div", {"class":"x1pi30zi 
        x1swvt13"}).find_all("div" , {"class":"x9f619 x1r8uery 
        x1iyjqo2 x6ikm8r x10wlt62 x1n2onr6"})
    new_dico_page1 = scrap_reel_page(soup_page) 
    anciennes_keys = list(new_dico_page2.keys()) 
    keys_to_add = [key for key in new_dico_page1.keys() if key not 
        in anciennes_keys]
    if len(keys_to_add) == 0:
        attempts_block  += 1
    for key,dico in new_dico_page1.items():
        if key not in anciennes_keys:
            dico_return_data[key]=dico
    new_dico_page2 = new_dico_page1 
    scrolldown(driver,1) 

由于这种特定的加载行为,此代码本质上等同于滚动和收集最后的所有内容。

提前感谢您的建议!

蟒蛇 facebook selenium-webdriver web-scraping 无限 滚动

评论


答: 暂无答案