1. 引言
在当今大数据时代,网络爬虫成为获取信息的重要手段之一。本文将以某家二手房为例,演示如何使用Python爬虫抓取房源信息,并将这些信息保存到Excel文件中。
目标网站
2. 准备工作
2.1 安装必要的库
在开始之前,请确保你的环境中已经安装了以下Python库:
requests
:用于发送HTTP请求。lxml
:提供了一个强大的XPath选择器,方便解析HTML文档。pandas
:用来处理和分析数据。fake_useragent
:随机生成User-Agent,以模拟不同的浏览器访问。
可以通过pip命令安装它们:
pip install requests lxml pandas fake_useragent
2.2 代理池准备
为了防止IP被封禁,我们需要准备一个代理池。这里假设你已经有了一个名为proxies.txt
的文件,其中每一行都存储了一个可用的代理服务器地址。
3. 代码详解
3.1 导入模块
首先需要导入所需的Python库:
import random
import pandas as pd
from lxml import etree
import requests
from fake_useragent import UserAgent
3.2 设置请求头
接下来设置请求头,特别是User-Agent字段,使用fake_useragent
库随机生成:
headers = {
'User-Agent': UserAgent().random
}
3.3 读取代理列表
在爬虫过程中,使用代理可以有效避免被网站封锁。我们从一个文件中读取代理服务器的列表,并将其存储到proxies
列表中:
file_path = "E:/Python/代理池/proxies.txt"
# 从文件中读取代理列表
proxies = []
with open(file_path, 'r') as file:
for line in file:
proxy = line.strip() # 去除每行末尾的换行符
proxies.append(proxy)
这里需要注意的是,确保proxies.txt
文件中的每一行都是有效的代理地址格式(例如:http://ip:port
)。
3.4 抓取数据
3.4.1 创建会话对象
为了更好地管理HTTP请求和保持连接状态,我们可以创建一个requests.Session
对象:
session = requests.session()
3.4.2 发送POST请求
针对链家二手房的不同页面,通过循环遍历页码来发送请求。每次请求时随机选择一个代理以减少被封禁的风险:
for page in range(1, 6): # 抓取第1页到第5页
url = f'https://bj.lianjia.com/ershoufang/pg{page}/'
# 使用随机选择的代理发送POST请求
response = session.post(url=url, proxies={'http': random.choice(proxies)}, headers=headers, timeout=10)
注意,这里使用了post
方法,但通常对于这类网页浏览请求,使用get
方法更为合适。这可能是一个示例代码的小错误,正确的做法应该是:
response = session.get(url, proxies={'http': random.choice(proxies)}, headers=headers, timeout=10)
3.4.3 解析HTML内容
一旦成功获取响应,接下来需要解析HTML文档,提取有用的信息。这里采用lxml
库提供的XPath功能:
tree = etree.HTML(response.text)
items = tree.xpath('//*[@id="content"]/div[1]/ul/li')
上述代码定位到了包含房源信息的列表项。
3.4.4 提取信息
对每个房源项目进行解析,提取标题、位置信息、房屋详情以及总价等字段:
data = []
for item in items:
title = item.xpath('./div[1]/div[1]/a/text()')[0] # 房源标题
positionInfo = item.xpath('./div[1]/div[2]/div/a[1]/text()')[0] + item.xpath('./div[1]/div[2]/div/a[2]/text()')[0] # 位置信息
houseInfo = item.xpath('./div[1]/div[3]/div/text()')[0] # 房屋信息
total_price = item.xpath('./div[1]/div[6]/div[1]/span/text()')[0] + item.xpath('./div[1]/div[6]/div[1]/i[2]/text()')[0] # 总价
data.append({
'标题': title,
'位置信息': positionInfo,
'房屋信息': houseInfo,
'总价': total_price
})
将这些信息添加到当前页面的数据集合data
中。
3.5 存储数据
当所有页面都处理完毕后,我们将收集到的所有数据合并成一个大的列表all_data
,然后转换为Pandas DataFrame,并最终保存为Excel文件:
# 将当前页面的数据添加到总数据列表
all_data.extend(data)
# 将所有数据转换为 DataFrame
df = pd.DataFrame(all_data)
# 将 DataFrame 写入 Excel 文件
df.to_excel('链家二手房.xlsx', index=False)
print("数据已成功保存到 Excel 文件中")
4. 运行结果
控制台输出
保存文档
5. 结论
本文介绍了如何利用Python编写简单的网络爬虫程序来抓取链家网上的二手房信息,并且展示了如何使用Pandas库将这些信息保存为Excel文件。
确保遵守目标网站的服务条款,在合法合规的前提下使用爬虫技术。