简介 | 特性 | 技术架构 | 快速开始 | 使用说明 | 免责声明 | 附录 | 学习交流
一个基于进程池的链家网快速爬虫项目,严禁将所得数据商用! 本项目只供学习使用,作者不承担任何由此带来的法律风险和损失! 同类采集房天下网小区项目
- 支持Python3.6+版本
- 支持数据存储sqliteDB中
- 支持导出Excel
- 支持自定义区域(省、市、区)采集
- Python3.8+ (建议3.9.0)
- request
- lxml的xpath解析
- sqlite
- clone本项目代码
- 在项目根目录创建Python虚拟环境venv
cd lianjia_spider
pip install virtualenv
virtualenv venv
- 安装依赖库
pip install -r requirements.txt
- 运行
python lianjia.py
- 根据提示输入对应信息采集
从 releases页面下载对应可执行程序,双击运行
- 程序运行时会使用sqlite数据库存储当前job运行历史,数据库文件
lianjia.db
目前程序采集了每个小区的建筑类型、房屋总数、楼栋总数、绿化率、容积率、交易权属、建成年代、用水类型、用电类型、挂牌均价、物业费、经纬度
可根据需要修改代码采集更多字段,修改get_community_detail
函数中xiaoqu_info.xpath
获取的部分代码
def get_community_detail(url):
response = requests.get(url)
if response.status_code == 200:
final_result = []
tree = etree.HTML(response.text)
xiaoquInfoItems = tree.xpath('//div[@class="xiaoquInfoItem"]')
for xiaoqu_info in xiaoquInfoItems:
label = xiaoqu_info.xpath('.//span[@class="xiaoquInfoLabel"]/text()')[0]
value = xiaoqu_info.xpath('.//span[@class="xiaoquInfoContent"]/text()')[0]
final_result.append({
"label": label,
"value": str(value)
})
final_result.append({
'label': '挂牌均价',
'value': get_price(tree)
})
final_result.append({ # 物业费
'label': str(tree.xpath('/html/body/div[6]/div[2]/div[2]/div[2]/div[1]/span[1]/text()')[0]),
'value': str(tree.xpath('/html/body/div[6]/div[2]/div[2]/div[2]/div[1]/span[2]/text()')[0])
})
final_result.append({ # 经纬度
'label': '经纬度',
'value': str(tree.xpath('/html/body/div[6]/div[2]/div[2]/div[2]/div[2]/span[2]/span/@mendian')[0])
})
return final_result
请勿将lianjia_spider
应用到任何可能会违反法律规定和道德约束的工作中,请友善使用lianjia_spider
,遵守蜘蛛协议,不要将lianjia_spider
用于任何非法用途。如您选择使用lianjia_spider
即代表您遵守此协议,作者不承担任何由于您违反此协议带来任何的法律风险和损失,一切后果由您承担。
-- 省份-城市表
CREATE TABLE IF NOT EXISTS `lj_base_province`
(
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`province_name` varchar(255),
`city_id` varchar(255),
`city_name` varchar(255),
`city_url` varchar(255),
`start_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
`end_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
`create_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
`update_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime'))
);
-- 城市区域表
CREATE TABLE IF NOT EXISTS `lj_base_areas`
(
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`city_id` varchar(255),
`region_id` varchar(255),
`region_name` varchar(255),
`region_url` varchar(255),
`sub_region_id` varchar(255),
`sub_region_name` varchar(255),
`sub_region_url` varchar(255),
`start_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
`end_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
`create_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
`update_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime'))
);
-- 所有小区表
CREATE TABLE IF NOT EXISTS `lj_base_xiaoqu`
(
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`city_id` varchar(255),
`region_id` varchar(255),
`sub_region_id` varchar(255),
`xiaoqu_id` varchar(255),
`xiaoqu_name` varchar(255),
`xiaoqu_url` varchar(255),
`create_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
`update_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime'))
);
-- 每个小区采集详细数据表
CREATE TABLE IF NOT EXISTS `lj_xiaoqu_detail`
(
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`xiaoqu_id` varchar(255),
`detail_json` varchar(500), -- 详细信息json格式
`create_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
`update_time` DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime'))
);
直接执行py文件进行打包
python build.py
MacOS打包命令
pyinstaller \
--clean \
--python="./venv/bin/python3" \
--windowed \
--name="lianjia-macos-arm64" \
--hidden-import "lxml" \
--hidden-import "pypinyin" \
--icon="./static/image/logo.icns" \
--add-data="static:static" \
gui.py
Windows打包命令
pyinstaller --clean --python="./venv/bin/python3" --windowed --name="LianJia-0.0.2-windows-x86_64" --hidden-import "lxml" --hidden-import "pypinyin" --icon="./static/image/logo.icns" --add-data="static;static" gui.py
扫码入群交流学习,如群二维码失效请加作者微信:FearlessMan888,备注:python群