LinkedIn爬虫问题:Selenium切换搜索页后元素未刷新如何解决?
问题
我正在爬取LinkedIn上的多个用户资料,需要遍历搜索结果的多页内容。我的代码如下:
for search in search_list: driver.get(search) time.sleep(30) names_searched = [] time.sleep(10) for pages in range(5,16): time.sleep(30) driver.refresh() all_users = driver.find_elements(By.XPATH, "//div[@class='search-results-container']//a[contains(@href,'miniProfileUrn')][contains(@class,'scale-down')]") for user in all_users: profile_links = user.get_attribute('href') names_searched.append(profile_links) go_profile(names_searched, counter, driver) scroll(driver) curr_page = '{}{}{}'.format(search, page_counter, pages) driver.get(curr_page) counter += 1
代码可正常运行,无过时元素错误或找不到元素的问题,但切换到搜索结果第2页及之后页面时,all_users并未获取到当前页的真实资料,仍使用初始页面的资料。我尝试通过添加sleep等待页面加载、调用driver.refresh()刷新页面,但问题依旧。请问我忽略了什么?
解决方案
- 分页URL拼接逻辑错误:LinkedIn的搜索分页是通过URL中的
page参数控制的,你当前用字符串拼接的方式完全不符合LinkedIn的URL结构,导致实际没有跳转到目标分页,页面始终停留在初始页,自然只会获取到初始页的资料。 - 未重置存储列表:
names_searched在分页循环外初始化,每次分页都会累加之前的链接,若页面未正确跳转,就会重复添加初始页内容,加剧数据重复问题。 - 多余的刷新操作:
driver.refresh()会重新加载当前URL,如果你跳转分页的URL本身就错误,刷新后还是停留在初始页,这步操作完全没必要。
修正步骤:
- 正确生成分页URL:使用URL解析工具修改
page参数,避免手动拼接出错:
from urllib.parse import urlparse, parse_qs, urlencode, urlunparse def generate_page_url(base_url, page_num): parsed_url = urlparse(base_url) query_params = parse_qs(parsed_url.query) query_params['page'] = [str(page_num)] new_query = urlencode(query_params, doseq=True) return urlunparse(parsed_url._replace(query=new_query))
在循环中调用该函数生成目标分页URL:
curr_page = generate_page_url(search, pages) driver.get(curr_page)
- 每次分页重置列表:将
names_searched = []移到分页循环内部,确保每次只存储当前页的资料链接:
for pages in range(5,16): names_searched = [] # 移除driver.refresh() # 用显式等待替代固定sleep,确保页面加载完成 WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.XPATH, "//div[@class='search-results-container']")) ) all_users = driver.find_elements(By.XPATH, "//div[@class='search-results-container']//a[contains(@href,'miniProfileUrn')][contains(@class,'scale-down')]") # 后续处理逻辑...
- 替换固定sleep为显式等待:固定时长的sleep无法适配网络波动,显式等待能在元素加载完成后立即执行后续操作,既提升效率又避免加载不充分的问题。
内容的提问来源于stack exchange,提问作者Jesper Ezra
相关产品推荐
相关产品推荐

