一个案例让你入门爬虫之二:Q房网爬虫多层页面爬取实例
时间:2022-06-25
本文章向大家介绍一个案例让你入门爬虫之二:Q房网爬虫多层页面爬取实例,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在上一篇中,我们仅仅爬取到了房源列表页面显示的房源信息,如果需要的房源信息只能在房源详情页中看到的话,就需要爬虫除了能够爬取房源列表页面,还要能够从房源列表页面中提取出房源详情页的URL,并爬取该URL(房源详情页面)的相关数据。
1.爬取详情页面分析
如果我们希望在上次爬取数据的基础上增加房屋年限、抵押信息等数据的话,而这些数据只能在详情页面中看到,如下图所示:
可以看到,交易属性那个栏目包含了房屋年限和抵押信息等。只有爬取详情页面才能抓取这些信息,所以需要在房源列表页面中提取房源的详情页面URL。
根据上图可以分析,很简单其实我们需要提取详情页面的URL,只需要把href属性的值用xpath解析出来,然后在前面加上 http://shenzhen.qfang.com ,即可构造出完整的房源详情页面URL,然后请求这个URL即可。
2.爬取详情页面代码实现
首先,导入需要的包,定义用户代理和网址前缀等所需常量。
import requests
from lxml import etree
import csv
import time
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"
}
pre_url = 'https://shenzhen.qfang.com/sale/f'
因为本次爬虫需要爬取房源列表和房源详情两个页面,为了实现代码复用,这里定义一个专门的下载函数,这个下载函数主要就是使用requests下载页面,并返回一个页面信息提取器。
def download(url):
html = requests.get(url,headers=headers)
time.sleep(2)
return etree.HTML(html.text)
接着,就是定义保存函数,这个上一篇也讲过。
def data_writer(item):
with open('qfang_shenzhen_ershou.csv','a',encoding='utf-8',newline='') as f:
writer = csv.writer(f)
writer.writerow(item)
下面就是最主要的爬取函数了,它主要实现从房源列表页面中解析出房源详情页面的URL,然后请求这个URL,从中获取房源年限和抵押信息等需要爬取的数据。
def spider(list_url):
#下载列表页
selector = download(list_url)
house_list = selector.xpath("//div[@id='cycleListings']/ul//li[@class='clearfix']")
#循环解析每套房源
for house in house_list:
title = house.xpath("/div[1]/p[1]/a/text()")[0]
apartment = house.xpath("/div[1]/p[2]/span[2]/text()")[0]
area = house.xpath("/div[1]/p[2]/span[4]/text()")[0]
decoration_type = house.xpath("/div[1]/p[2]/span[6]/text()")[0]
cenggao = house.xpath("/div[1]/p[2]/span[8]/text()")[0].strip()
orientation = house.xpath("/div[1]/p[2]/span[10]/text()")[0]
build_finishtime = house.xpath("/div[1]/p[2]/span[12]/text()")[0]
location = house.xpath("/div[1]/p[3]/span[2]/a/text()")[0]
total_price = house.xpath("//div[@class='show-price']")[0].strip()
#解析并构造详情页URL
house_url = ('http://shenzhen.qfang.com' + house.xpath("div[1]/p[1]/a/@href")[0])
#下载详情页
sel = download(house_url)
time.sleep(1)
house_years = sel.xpath("//div[@class='housing-info']/ul/li[2]/div/ul/li[3]/div/text()")[0]
mortgage_info = sel.xpath("//div[@class='housing-info']/ul/li[2]/div/ul/li[5]/div/text()")[0]
item = [title,apartment,area,decoration_type,cenggao,orientation,build_finishtime,location,total_price,house_years,mortgage_info]
print('正在爬取',title)
data_writer(item)
上面代码提取出了房源的详情页面house_url,继续使用download函数下载这些页面,然后返回sel选择器继续使用xpath进行解析提取数据。
最后,定义主函数,运行爬虫进行爬取。
if __name__ == '__main__':
for x in range(1,100):
spider(pre_url + str(x))
这样就完成了本次爬取任务,只是简单地在上一篇基础扩展一下,完整代码如下:
import requests
from lxml import etree
import csv
import time
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"
}
pre_url = 'https://shenzhen.qfang.com/sale/f'
def spider(list_url):
#下载列表页
selector = download(list_url)
house_list = selector.xpath("//div[@id='cycleListings']/ul//li[@class='clearfix']")
#循环解析每套房源
for house in house_list:
title = house.xpath("/div[1]/p[1]/a/text()")[0]
apartment = house.xpath("/div[1]/p[2]/span[2]/text()")[0]
area = house.xpath("/div[1]/p[2]/span[4]/text()")[0]
decoration_type = house.xpath("/div[1]/p[2]/span[6]/text()")[0]
cenggao = house.xpath("/div[1]/p[2]/span[8]/text()")[0].strip()
orientation = house.xpath("/div[1]/p[2]/span[10]/text()")[0]
build_finishtime = house.xpath("/div[1]/p[2]/span[12]/text()")[0]
location = house.xpath("/div[1]/p[3]/span[2]/a/text()")[0]
total_price = house.xpath("//div[@class='show-price']")[0].strip()
#解析并构造详情页URL
house_url = ('http://shenzhen.qfang.com' + house.xpath("div[1]/p[1]/a/@href")[0])
#下载详情页
sel = download(house_url)
time.sleep(1)
house_years = sel.xpath("//div[@class='housing-info']/ul/li[2]/div/ul/li[3]/div/text()")[0]
mortgage_info = sel.xpath("//div[@class='housing-info']/ul/li[2]/div/ul/li[5]/div/text()")[0]
item = [title,apartment,area,decoration_type,cenggao,orientation,build_finishtime,location,total_price,house_years,mortgage_info]
print('正在爬取',title)
data_writer(item)
def download(url):
html = requests.get(url,headers=headers)
time.sleep(2)
return etree.HTML(html.text)
def data_writer(item):
with open('qfang_shenzhen_ershou.csv','a',encoding='utf-8',newline='') as f:
writer = csv.writer(f)
writer.writerow(item)
if __name__ == '__main__':
for x in range(1,100):
spider(pre_url + str(x))
- 玩玩文本挖掘-wordcloud、主题模型与文本分类
- Typecho 前台 getshell 漏洞分析
- 关于其他选择器以及选择器优先级详解
- 2016.05 第二周 群问题分享
- MyFlash——美团点评的开源MySQL闪回工具
- R语言关联规则可视化:扩展包arulesViz的介绍
- JS设置标签的内容和样式
- 大圣魔方——美团点评酒旅BI报表工具平台开发实践
- 详析获取标签
- 深度学习及AR在移动端打车场景下的应用
- R案例操作:RQDA和tm包结合进行文本挖掘
- 用Vue.js开发微信小程序:开源框架mpvue解析
- 分类模型的性能评估——以SAS Logistic回归为例: 混淆矩阵
- R语言,你要怎样画地图?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在CentOS8上安装Surelog
- sqlplus执行错误的问题探究
- 不借助Maven,使用Eclipse创建Hello World级别的Spring项目
- Spring Bean的生命周期
- Spring Bean 后置处理器PostProcessor
- 潘石屹用Python解决100个问题 | 排列组合
- 潘石屹用Python解决100个问题 | 企业根据利润提成发奖金
- 【STM32F407开发板用户手册】第27章
- Spring Bean的继承
- 移动端点击事件延迟的诞生消亡史
- 谈谈电商系统中的商品模块设计
- [数据结构与算法] 排序算法之冒泡排序与快速排序(快排)
- [数据结构与算法] 邂逅栈
- Hive建表异常
- Spring全家桶之SpringData——Spring 整合Hibernate与Hibernate Jpa