我正在从一个网站上抓取新闻文章,在这个网站上,一个特定的分类页面上没有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的数量,它也只会返回第一页的链接,我在写滚动部分时犯了一些错误。请帮助我。
1条答案
按热度按时间dsf9zpds1#
我没有使用每个body的
scrollHeight
属性来滚动,而是检查要滚动到的文章列表后面是否有合适的元素。因此,我主要修改了函数
get_article_links
中的while
循环,在找到div之后,在循环开始之前使用location_once_scrolled_into_view滚动到此div,如下所示:如果我们现在用不同的
limit_loading
调用这个函数,我们会得到不同的唯一新闻链接计数。