Python使用requests+Selenium爬取动态站点广告链接数据不更新求解
问题核心原因
你的代码存在3个核心错误导致数据无法更新:
- 你用
requests.get获取的是站点静态源码,动态渲染的房屋广告数据requests根本拿不到,而且后续滚动加载新内容后,你始终没有重新获取Selenium渲染后的最新页面源码,一直在复用第一次requests拿到的旧articles列表,所以永远读不到新链接 - 循环逻辑错误:你遍历的是初始的
links_urls,每次追加的还是旧articles的链接,列表只会重复新增旧数据,永远匹配不到你设定的最终校验链接 - 滚动页面后没有加等待时间,新广告还没渲染完成就执行后续逻辑,就算你拿新源码也可能取不到新数据
修复方案
直接用Selenium拿渲染后的页面源码,每次滚动后重新解析源码、去重存链接,直到命中校验链接为止,修正后的代码如下:
from selenium import webdriver from selenium.webdriver.common.keys import Keys from bs4 import BeautifulSoup import time def get_link_info(): options = webdriver.ChromeOptions() # 可开启无头模式加快运行速度 # options.add_argument('--headless') url = "https://kvartiry-bolgarii.ru/" driver = webdriver.Chrome( executable_path=r'C:\Users\kk\Desktop\scrape_house\drivers\chromedriver.exe', options=options ) driver.get(url) # 给初始页面预留加载时间,可根据网络情况调整 time.sleep(3) links_urls = [] check = "https://kvartiry-bolgarii.ru/kvartira-v-elitnom-komplekse-s-unikalynym-sadom-o21751" while True: # 每次都读取Selenium渲染后的最新页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, "lxml") articles = soup.find_all("div", class_="content") # 新增链接自动去重,避免重复存入 for article in articles: house_url = article.find("a").get("href") if house_url not in links_urls: links_urls.append(house_url) # 校验是否已经爬取到目标最终链接 if check in links_urls: print(links_urls[0], links_urls[-1]) print("all links are ready") break # 滚动到页面底部触发加载 html = driver.find_element_by_tag_name('html') html.send_keys(Keys.END) # 预留加载新广告的时间 time.sleep(3) # 打印进度方便调试 print(f"当前已爬取链接数:{len(links_urls)},最新链接:{links_urls[-1]}") # 退出驱动释放资源 driver.quit() return links_urls
额外优化建议
- 链接去重可以改用set结构,判断存在的效率比列表高很多
- 可以增加页面高度校验逻辑:如果连续两次滚动后页面高度没有变化,说明已经没有更多新内容,可以直接终止循环,不需要死等校验链接出现
- 要是对爬取速度有要求,可以直接抓站点的Ajax数据接口,不需要用Selenium滚动,爬取效率会提升数倍
内容的提问来源于stack exchange,提问作者Дмитрий
相关产品推荐
相关产品推荐

