一、地址:
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'))
)
# 解析列表页HTML
html = 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.弹出的网页运行可视化展示
这样就可以爬取到想要的数据了~