一、地址:
url = "https://zb.newhouse.fang.com/house/s/b91" # 第一页的 URL
但是这个爬虫我不知道为啥总是翻不了页数,请帮忙修改一下~
二、用到的知识点以及代码详解:
这段代码是一个使用Selenium和lxml库实现的网页爬虫,主要用于爬取房天下网站(https://fang.com)上淄博地区的新房信息。
主要功能
-
使用Selenium控制Chrome浏览器自动翻页爬取新房列表
-
对每个新房项目打开详情页提取详细信息
-
提取的信息包括:房屋标题、价格、地址、咨询电话和户型
-
自动处理翻页逻辑,直到最后一页
-
包含异常处理机制,防止程序意外中断
代码特点
-
自动化浏览器控制:使用Selenium模拟真实用户操作浏览器
-
显式等待:使用WebDriverWait确保元素加载完成后再进行操作
-
多标签页处理:在新标签页中打开详情页,不影响列表页状态
-
健壮性设计:
-
包含多种异常处理
-
检查元素是否存在再操作
-
处理浏览器意外关闭情况
-
-
数据提取:使用lxml的XPath高效提取所需信息
# 导入必要的库
import time
from lxml import etree
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.common.exceptions import InvalidSessionIdException# 配置 ChromeDriver
service = Service(executable_path=r"D:\chromdriver\chromedriver-win64\chromedriver.exe")
driver = webdriver.Chrome(service=service)
driver.set_page_load_timeout(30) # 设置页面加载超时时间为 30 秒def parse_detail_page(link):"""打开详情页并提取信息功能:在新标签页中打开详情页,等待页面加载完成后调用解析函数,最后关闭详情页标签参数:link: 详情页的URL链接"""try:# 使用JavaScript在新标签页中打开链接driver.execute_script("window.open('%s')" % link)# 切换到新打开的标签页driver.switch_to.window(driver.window_handles[1])# 显式等待,直到价格信息元素加载完成WebDriverWait(driver, timeout=10).until(EC.presence_of_element_located((By.XPATH, '//div[@class="price_line clearfix"]')))# 调用详情页解析函数parse_detail_info(driver.page_source)except Exception as e:print("解析详情页时出错:", e)finally:# 确保关闭详情页标签并切换回列表页if len(driver.window_handles) > 1:driver.close()driver.switch_to.window(driver.window_handles[0])def parse_detail_info(source):"""从详情页HTML源码中提取房屋信息功能:使用lxml解析HTML,提取房屋标题、价格、地址、电话和户型信息参数:source: 详情页的HTML源码"""# 将HTML源码转换为lxml的HTML对象html = etree.HTML(source)# 提取房屋标题(位于h1标签内)title = html.xpath('//h1//text()')print("房屋价格:", title[0] if title else "未知")# 提取价格信息(位于class为price_line clearfix的div内)price = html.xpath('//div[@class="price_line clearfix"]//p//text()')price = " ".join(price).strip() if price else "未知"print("价格:", price)# 提取地址信息(id为xfptxq_B04_12的div内的span标签)address = html.xpath('//div[@id="xfptxq_B04_12"]/span/text()')print("地址:", address[0] if address else "未知")# 提取咨询电话(class为phone_num的元素内)phone = html.xpath('//*[@class="phone_num"]/span[2]/text()')phone = " ".join(phone).strip() if phone else "未知"print("咨询电话:", phone)# 提取户型信息(class为fl zlhx的div内的a标签)layout = html.xpath('//div[@class="fl zlhx"]/a/text()')layout = " ".join(layout).strip() if layout else "未知"print("户型:", layout)print("---------------------------------------------------------")# 主程序入口
if __name__ == "__main__":# 初始URL(淄博新房列表第一页)url = "https://zb.newhouse.fang.com/house/s/b91"driver.get(url)try:# 主循环,持续爬取直到最后一页while True:print(f"正在爬取页面: {driver.current_url}")# 等待列表页加载完成(等待ul元素出现)WebDriverWait(driver, timeout=10).until(EC.presence_of_element_located((By.XPATH, '//div[@class="main_1200 tf"]//ul')))# 解析列表页HTMLhtml = etree.HTML(driver.page_source)# 获取所有房源列表项lis = html.xpath('//div[@class="main_1200 tf"]//ul/li')# 遍历每个房源项for li in lis:try:# 获取房源详情页链接link = li.xpath(".//a/@href")[0]# 检查链接有效性(只处理房天下域名的链接)if link.startswith("https://zb.newhouse.fang.com"):parse_detail_page(link)else:print("跳过无效链接:", link)except IndexError:print("未找到链接,跳过该条目")continue# 翻页逻辑try:# 记录当前URL用于判断页面是否已跳转current_url = driver.current_url# 查找下一页按钮next_btn = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//a[@class='next']")))# 检查下一页按钮是否可用(是否已到最后一页)if "disabled" in next_btn.get_attribute("class"):print("已到达最后一页,停止爬取")break # 退出循环else:# 使用JavaScript点击下一页按钮(避免元素拦截问题)driver.execute_script("arguments[0].click();", next_btn)# 等待URL发生变化(页面跳转完成)WebDriverWait(driver, 10).until(lambda driver: driver.current_url != current_url)# 等待新页面的房源列表加载完成WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@class="main_1200 tf"]//ul')))time.sleep(2) # 额外等待2秒确保页面完全加载except Exception as e:print("翻页时出错:", e)break # 出错时退出循环# 处理浏览器会话异常(如浏览器意外关闭)except InvalidSessionIdException:print("浏览器会话已关闭,重新初始化浏览器...")driver.quit()# 重新初始化浏览器driver = webdriver.Chrome(service=service)driver.get(url) # 重新加载初始页面finally:# 确保最终关闭浏览器driver.quit()
三、运行结果
1.pycharm里面的代码运行结果
2.弹出的网页运行可视化展示
这样就可以爬取到想要的数据了~