selenium 在具有动态滚动的网站中不向下滚动

xzv2uavs  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(147)

我正在从一个网站上抓取新闻文章,在这个网站上,一个特定的分类页面上没有load-more按钮,当我向下滚动时,新闻文章的链接就产生了。我写了一个函数,它接受输入category_page_url和limit_page(我想向下滚动多少次),然后返回该页面上显示的新闻文章的所有链接。
类别页面链接= https://www.scmp.com/topics/trade

def get_article_links(url, limit_loading):
    
    options = webdriver.ChromeOptions()
    
    lists = ['disable-popup-blocking']

    caps = DesiredCapabilities().CHROME
    caps["pageLoadStrategy"] = "normal"

    options.add_argument("--window-size=1920,1080")
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-notifications")
    options.add_argument("--disable-Advertisement")
    options.add_argument("--disable-popup-blocking")
    
    driver = webdriver.Chrome(executable_path= r"E:\chromedriver\chromedriver.exe", options=options) #add your chrome path

    
    driver.get(url)
    last_height = driver.execute_script("return document.body.scrollHeight")
    
    loading = 0
    while loading < limit_loading:
        loading += 1
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(8)
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height
        
        
    article_links = []
    bsObj = BeautifulSoup(driver.page_source, 'html.parser')
    for i in bsObj.find('div', {'class': 'content-box'}).find('div', {'class': 'topic-article-container'}).find_all('h2', {'class': 'article__title'}):
        article_links.append(i.a['href'])
    
    return article_links

假设我想在这个分类页面中滚动5次,

get_article_links('https://www.scmp.com/topics/trade', 5)

但即使我改变了我的limit_page的数量,它也只会返回第一页的链接,我在写滚动部分时犯了一些错误。请帮助我。

dsf9zpds

dsf9zpds1#

我没有使用每个body的scrollHeight属性来滚动,而是检查要滚动到的文章列表后面是否有合适的元素。

<div class="topic-content__load-more-anchor" data-v-db98a5c0=""></div>

因此,我主要修改了函数get_article_links中的while循环,在找到div之后,在循环开始之前使用location_once_scrolled_into_view滚动到此div,如下所示:

loading = 0
    end_div = driver.find_element('class name','topic-content__load-more-anchor')
    while loading < limit_loading:
        loading += 1
        print(f'scrolling to page {loading}...')        
        end_div.location_once_scrolled_into_view
        time.sleep(2)

如果我们现在用不同的limit_loading调用这个函数,我们会得到不同的唯一新闻链接计数。

>>> ar_links = get_article_links('https://www.scmp.com/topics/trade', 2)
>>> len(ar_links)
scrolling to page 1...
scrolling to page 2...

90
>>> ar_links = get_article_links('https://www.scmp.com/topics/trade', 3)
>>> len(ar_links)
scrolling to page 1...
scrolling to page 2...
scrolling to page 3...

120

相关问题