|
发表于 2023-7-18 12:42:40
|
显示全部楼层
根据你提供的代码,可能有以下几个问题导致爬取出错:
1. 需要等待页面加载完成再进行操作:在加载列表页时,需要等待页面加载完成后再进行操作,以确保页面元素已经完全加载出来。你可以使用 WebDriverWait 来等待元素的出现或可点击状态。在你的代码中,可以将 html = brower.page_source 移到 wait.until() 的后面。
2. 等待条件不准确:代码中使用了等待条件 EC.presence_of_element_located((By.XPATH, "//div[@class='pager_container']/span[last()]")),即等待最后一个分页按钮出现。但是在拉勾网的分页结构中,并不是最后一个按钮就代表没有下一页了,还需判断该按钮的类名是否包含 'pager_next_disabled',才能确定是否到达了最后一页。你可以修改判断语句为 if 'pager_next_disabled' in next_button.get_attribute('class'):。
3. 浏览器关闭位置错误:在列表页爬取循环中,当判断到已到达最后一页并准备结束时,应在 if 分支内使用 brower.close() 关闭浏览器。在你的代码中,将 brower.close() 放在了 while True 循环外,导致浏览器无法正常关闭。
修正后的代码示例:
- import time
- import logging
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.webdriver.support.wait import WebDriverWait
- from selenium.common.exceptions import TimeoutException
- logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
- index_page = 3
- time_out = 10
- index_url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
- # 初始化浏览器
- path = 'D:/技能/chromedriver.exe'
- browser = webdriver.Chrome(executable_path=path)
- # 显示等待
- wait = WebDriverWait(browser, time_out)
- # 发起请求
- def scrape_url(url, condition, locator):
- logging.info(f'正在爬取{url}')
- try:
- browser.get(url)
- wait.until(condition(locator))
- except TimeoutException:
- logging.error('error occurred while scraping {}'.format(url), exc_info=True)
- # 加载列表页
- def scrape_page():
- while True:
- scrape_url(index_url, condition=EC.presence_of_element_located,
- locator=(By.XPATH, "//div[@class='pager_container']/span[last()]"))
- html = browser.page_source
- print(html)
- next_button = browser.find_element(By.XPATH, "//div[@class='pager_container']/span[last()]")
- if 'pager_next_disabled' in next_button.get_attribute('class'):
- browser.close()
- break
- else:
- next_button.click()
- time.sleep(1)
- def main():
- scrape_page()
- if __name__ == '__main__':
- main()
复制代码
希望能帮到你!如果问题仍然存在,请提供更详细的错误信息以便进行进一步排查。 |
|