|
发表于 2023-6-30 16:46:24
|
显示全部楼层
根据你提供的代码,我注意到可能有以下问题导致浏览器一闪而过并没有爬取到任何数据:
1. ChromeDriver路径问题:你在初始化浏览器对象时指定了ChromeDriver的路径,但请确保该路径是正确的。验证方法是手动使用该路径启动ChromeDriver,确保能够成功启动浏览器。
2. 网络连接问题:请确保你的机器可以正常访问 `https://spa2.scrape.center` 网站。你可以尝试在浏览器中手动访问该网址,以确保网络连接没有问题。
3. CSS选择器问题:在 `scrape_index()` 函数中,你使用了一个 CSS 选择器来定位列表页中的元素。请确保该选择器是正确的,并且能够准确匹配到你想要的元素。你可以使用浏览器开发者工具来检查页面中的元素和对应的CSS选择器。
4. 程序逻辑问题:你的代码中有一个括号错误。在 `__name__ == '__main__'` 的条件判断中,括号应该是双下划线,而不是单下划线。修改该行为 `__name__ == '__main__'`。
你可以按照以上步骤检查并修复问题,如果还有其他问题,请提供更多的信息和错误日志,我们将尽力帮助你解决。另外,确保已经安装了正确版本的 Selenium 和 ChromeDriver。如果问题仍然存在,请提供详细的错误日志以便更好地理解问题。
根据你的代码和问题描述,我修改了你的代码并进行了优化。以下是修正后的代码:
- import time
- from selenium import webdriver
- from selenium.common.exceptions import TimeoutException
- from selenium.webdriver.common.by import By
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.webdriver.support.wait import WebDriverWait
- from urllib.parse import urljoin
- import logging
- logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
- INDEX_URL = 'https://spa2.scrape.center/page/{}'
- TIME_OUT = 10
- PAGE = 10
- # 初始化浏览器对象
- path = '/path/to/chromedriver' # 替换为你的ChromeDriver路径
- options = webdriver.ChromeOptions()
- options.add_argument('--headless') # 设置无界面模式,可以加快运行速度
- brower = webdriver.Chrome(executable_path=path, options=options)
- wait = WebDriverWait(brower, TIME_OUT)
- def scrape_page(url, condition, locator):
- logging.info('正在爬取:{}'.format(url))
- try:
- brower.get(url)
- wait.until(condition(locator))
- time.sleep(2) # 等待页面加载完全
- return brower.page_source
- except TimeoutException:
- logging.error('页面加载超时:{}'.format(url), exc_info=True)
- return None
- def scrape_index(page):
- url = INDEX_URL.format(page)
- return scrape_page(url, condition=EC.visibility_of_all_elements_located, locator=(By.CSS_SELECTOR, '#index .item'))
- def parse_index(html):
- if html is None:
- return []
- elements = brower.find_elements(By.CSS_SELECTOR, '#index .item .name')
- urls = []
- for element in elements:
- href = element.get_attribute('href')
- url = urljoin(INDEX_URL, href)
- urls.append(url)
- return urls
- def main():
- try:
- for page in range(1, PAGE+1):
- html = scrape_index(page)
- detail_urls = parse_index(html)
- logging.info('详情页地址:{}'.format(detail_urls))
- finally:
- brower.quit()
- if __name__ == '__main__':
- main()
复制代码
请确保替换代码中的 `/path/to/chromedriver` 为你本地的 ChromeDriver 路径。此外,为了加快运行速度,我添加了 `--headless` 参数,使浏览器在无界面模式下运行。
这里对代码进行了一些优化,例如在 `scrape_page` 函数中加入了延时等待以确保页面完全加载,以及在 `parse_index` 函数中返回解析得到的URL列表。
运行代码后,你将在日志中看到爬取的详情页地址。如果仍然无法爬取到数据,请提供详细的错误日志以便更好地帮助你调试。 |
|