# LianjiaSpider
## 目标
我们的目标站点是链家,主要爬取[在售二手房](https://cs.lianjia.com/ershoufang/)数据以及[已售成交](https://cs.lianjia.com/chengjiao/)数据
本次爬取在售数据的七个字段(房子id、小区名称、房子总价、房子单价、所属行政区、详细区域、面积),
已售数据的八个字段(房子id、小区名称、房子总价、房子单价、所属行政区、具体地区、交易年份、交易月份、面积)
简单分析一下目标源
- 一页共30条
- 分页规则不连续,需要手动获取最大分页数
- 每一项的数据字段排序都是规则且不变
## 开始
我们的爬取步骤如下
- 分析页面,获取对应区域总页数totalPage
- 分析页面,循环爬取所有页面的信息
- 将爬取的信息存入数据库
### 安装
项目开发使用Go版本为1.13.7,建议使用>=1.13.7版本运行软件
```
$ git clone git@github.com:xietongMe/LianjiaSpider.git
$ cd LianjiaSpider
```
修改config/application.yaml中的配置为你本地的数据库配置
创建database并将其填入配置文件中
### 运行
```
$ go run main.go
```
### 代码片段
#### 1、获取总页数-spier/gettingPage.go
由于每个区的分页总数不同,因此需要根据爬取的不同地区的页面来判断总分页数为多少
,其核心部分为
```//获取class属性为contentBottom的div标签下的class属性为house-lst-page-box的div标签
c.OnHTML(".contentBottom .house-lst-page-box", func(e *colly.HTMLElement) {
page := Page{}
err := json.Unmarshal([]byte(e.Attr("page-data")), &page)
if err != nil {
log.Fatalln(err)
}
totalPage = page.TotalPage
})
```
在这里我们的爬虫框架使用的是colly,colly的使用建议阅读[colly的使用](https://juejin.im/post/5d2fb6845188252a7b1d8a32)
其中.contentBottom .house-lst-page-box是对class属性为这两个值的div标签匹配,而e.Attr("page-data")则是获取匹配到的标签的属性值,由于其属性值为json,因此对其进行解析。
#### 2、获取二手房在售信息-spier/sellingSpider.go
```
c.OnHTML(".sellListContent>li", func(e *colly.HTMLElement) {
re, _ := regexp.Compile(`\d+`) //正则表达式用来匹配数字
houseId := e.Attr("data-lj_action_housedel_id") //获取房子ID,可根据ID直接访问房子详情主页
nameRegion := e.ChildText("div.info > div.flood > div.positionInfo > a") //同时获取小区名和详细地区
name := strings.Split(nameRegion, " ")[0] //将同时获取的小区名和详细地区分离,取其中的小区名字
region := strings.Split(nameRegion, " ")[1] //将同时获取的小区名和详细地区分离,取其中的详细地区
totalPrice, _ := strconv.Atoi(string(re.Find([]byte(e.DOM.Find(".info .priceInfo .totalPrice span").Eq(0).Text())))) //根据页面元素获取总价,正则匹配数字,转换成int类型
unitPrice, _ := strconv.Atoi(string(re.Find([]byte(e.DOM.Find(".info .priceInfo .unitPrice span").Eq(0).Text())))) //读取页面元素获取单价,正则匹配单价的数字,转换成int类型
area, _ := strconv.Atoi(string(re.Find([]byte(strings.Split(e.ChildText("div.info > div.address > div.houseInfo "), " | ")[1])))) // //读取页面元素获取面积,正则匹配单价的数字,转换成int类型
if houseId != "" {
fmt.Println("start save", houseId, page)
sellingInfo := model.Selling{Id: houseId, Name: name, TotalPrice: totalPrice, UnitPrice: unitPrice, District: districtName, Region: region, Area: area}
err := db.Save(&sellingInfo).Error
for ; err != nil; {
sellingInfo := model.Selling{Id: houseId, Name: name, TotalPrice: totalPrice, UnitPrice: unitPrice, District: districtName, Region: region, Area: area}
err = db.Save(&sellingInfo).Error
}
}
})
```
这里主要还是根据页面结构,来匹配不同的字段,可以通过访问[链家在售信息](https://cs.lianjia.com/ershoufang/)在控制台查看不同属性值对应的标签
#### 3、获取成交信息-spier/soldSpider.go
```
c.OnHTML(".listContent>li", func(e *colly.HTMLElement) {
re, _ := regexp.Compile(`\d+`) //正则表达式用来匹配数字
houseId := string(re.Find([]byte(strings.Split(e.ChildAttr("div.info > div.title > a", "href"), "/")[4]))) //获取房子ID,可根据ID直接访问房子详情主页
name := strings.Split(e.ChildText("div.info > div.title > a"), " ")[0] //获取小区名
area := 0
if len(strings.Split(e.ChildText("div.info > div.title > a"), " ")) == 3 {
area, _ = strconv.Atoi(string(re.Find([]byte(strings.Split(e.ChildText("div.info > div.title > a"), " ")[2])))) //获取总面积
}
totalPrice, _ := strconv.Atoi(e.DOM.Find(".info .address .totalPrice span").Eq(0).Text()) //获取总价
unitPrice, _ := strconv.Atoi(string(re.Find([]byte(e.DOM.Find(".info .flood .unitPrice span").Eq(0).Text())))) //获取单价
dealDate := e.DOM.Find(".info .address .dealDate").Eq(0).Text() //获取成交年月日
soldYear := strings.Split(dealDate, ".")[0] //分离出成交年份
soldMonth := strings.Split(dealDate, ".")[1] //分离出成交月
if houseId != "" {
fmt.Println("start save", houseId, page)
soldInfo := model.Sold{Id: houseId, Name: name, TotalPrice: totalPrice, UnitPrice: unitPrice, District: districtName, SoldYear: soldYear, SoldMonth: soldMonth, Area: area}
err := db.Save(&soldInfo).Error
for ; err != nil; {
soldInfo := model.Sold{Id: houseId, Name: name, TotalPrice: totalPrice, UnitPrice: unitPrice, District: districtName, SoldYear: soldYear, SoldMonth: soldMonth, Area: area}
err = db.Save(&soldInfo).Error
}
}
})
```
这里也是根据成交页面结构,来匹配不同的字段,可以通过访问[链家成交信息](https://cs.lianjia.com/chengjiao/)在控制台查看不同属性值对应的标签
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
资源推荐
资源详情
资源评论
收起资源包目录
Golang爬虫 爬取长沙的在售房价数据以及成交房价数据.zip (12个子文件)
WGT-code
spider
soldSpider.go 3KB
sellingSpider.go 3KB
gettingPage.go 2KB
go.mod 667B
go.sum 22KB
common
database.go 959B
model
sold.go 808B
selling.go 1KB
.gitignore 5B
README.md 6KB
config
application.yaml 153B
main.go 2KB
共 12 条
- 1
资源评论
JJJ69
- 粉丝: 6210
- 资源: 5783
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功