我正在尝试爬取PressReader网站上的新闻内容,但遇到了一个问题。每个页面上只显示了少量新闻,而要查看更多内容需要通过鼠标左右滑动来加载。加载完其他内容后,原先显示的内容又会被覆盖掉。我该如何一次性获取搜索到的所有新闻内容呢?
我已经使用Python和Selenium来爬取网页内容,但是鼠标左右滑动这种情况让我不太清楚如何处理。我知道可以通过模拟滑动来加载更多内容,但是这样做的话原先加载的内容就会被替换掉,我需要的是将所有加载的内容都获取到。
请问有什么方法可以在一次性加载所有内容的情况下获取PressReader网站搜索结果中的所有新闻内容吗?我是否需要使用其他工具或技术来实现这个目标?感谢您的帮助!
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
url_login = "http://ezproxy.lb.polyu.edu.hk/login?url=https://www.pressreader.com/"
executable_path = r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'
options = Options()
options.set_capability('pageLoadStrategy', 'normal')
options.add_argument('--no-sandbox')
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_experimental_option('detach', True)
options.add_experimental_option('excludeSwitches', ['enable-automation', 'enable-logging'])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=executable_path)
driver.get(url_login)
wait = WebDriverWait(driver, 300)
try:
wait.until(EC.element_to_be_clickable(
(By.CSS_SELECTOR, 'button[type="submit"]')))
driver.find_element(By.CSS_SELECTOR,
'button[type="submit"]').click()
wait.until(EC.presence_of_element_located(
(By.XPATH, '//span[@class="pri pri-search"]')))
driver.find_element(By.XPATH,
'//span[@class="pri pri-search"]').click()
driver.find_element(By.XPATH,
'//div[@class="flic-in"]/div').click()
wait.until(EC.element_to_be_clickable(
(By.ID, 'searchQuery')))
driver.find_element(By.ID,
'searchQuery').send_keys('Evergrande')
driver.find_element(By.XPATH,
'//div[@class="toolbar-right"]/a').click()
except Exception as e:
print(e); driver.close()
# niagara_falls = driver.find_element(By.CLASS_NAME, "toolbar-slider-right")
js = "var q=document.documentElement.scrollWidth=10000000"
# driver.execute_script(js, niagara_falls)
driver.execute_script(js)
print('Done ...')
【以下回答由 GPT 生成】
问题分析
根据问题描述,你想要通过Selenium爬取PressReader网站上的所有新闻内容,但由于每次滑动加载会替换掉原先加载的内容,导致只能获取到少量新闻。你询问是否有方法可以一次性获取所有的新闻内容,并询问是否需要使用其他工具或技术来实现这个目标。
解决方案
在目前使用的代码基础上,我们可以添加以下步骤来一次性获取所有的新闻内容:
确定加载新闻内容的滑动操作。通过分析网页的源代码,找到包含新闻内容的元素,并确定它们是通过何种滑动操作加载的。
使用Selenium模拟多次滑动操作。计算出需要滑动的次数,然后循环执行滑动操作,直到加载到所有新闻内容为止。在每次滑动后,等待一段时间以确保新内容加载完全。
获取已加载的所有新闻内容。在滑动操作加载新内容后,使用Selenium定位到所有新闻内容的元素,并将其提取到一个列表中。
下面是代码示例,演示如何一次性获取所有加载的新闻内容:
# 添加滑动操作以加载更多内容
scroll_element = driver.find_element(By.XPATH, "//div[@class='flick-items-container']")
scroll_count = 0
while True:
scroll_count += 1
driver.execute_script("arguments[0].scrollLeft = arguments[0].scrollWidth", scroll_element)
time.sleep(1) # 等待新内容加载完成的时间,可根据实际情况进行调整
# 判断是否到达最右侧
if scroll_count >= 5:
break
# 获取已加载的所有新闻内容
news_elements = driver.find_elements(By.XPATH, "//div[@class='hotspot']")
news_content = []
for element in news_elements:
news_content.append(element.text)
以上代码中,使用了driver.execute_script()
执行JavaScript代码来实现滑动操作。scroll_element
变量定位到包含新闻内容的元素,然后使用arguments[0].scrollLeft = arguments[0].scrollWidth
将其滑动到最右侧。为了确保新内容加载完成,我们添加了一个等待时间time.sleep()
。
最后,使用driver.find_elements()
定位到所有新闻内容的元素,并将其文本内容提取到news_content
列表中。
请将以上代码添加到你的代码中,并根据实际情况进行调整。希望能帮助到你!如有其他问题,请随时提问。
【相关推荐】