python爬虫爬取房源_python爬虫爬取安居客房源信息

Xpath插件的安装

链接:https://pan.baidu.com/s/1T3V11Ev8dPODa2fCRbeuCg

提取码:qvzf

fa9adc54f90319f871731d137bdf121f.png

将这个安装包解压缩

打开谷歌浏览器的扩展程序 ----> 打开开发者模式 ----> 点击加载已解压的扩展程序 ----> 选择解压的文件夹

看下图操作

57b982b455db5fd7ab787f8253792bfa.png

2f7af2e8a1a027d737b94ce4fd62fcb4.png

abfbcb2c750219f0cafc8d2aa16ae526.png

就会出现这个

23ab7779b0604e59b55523f9b57fc44d.png

浏览器导航栏上也会出现X图标

dff1917c7ba48dc4bf257d723965e19b.png

点击图标就会弹出 再点击就会关闭(或者使用快捷键ctrl+shift+X) 会出现这样的黑框 左边写Xpath语法 右面是匹配到的结果 还可以看到匹配到的数量

363d0978e97abc57fbdb03cd41c67bb8.png

需要自己去学习一下Xpath定位的语法 很简单的 这里就不赘述了

爬取重庆花溪附近的房源信息(进入正题啦~)

先看一下页面的样子,梳理下逻辑

列表页页面

919d9fda95f871101daff5860bb68248.png

列表页的分页按钮

6eec511ef7c227d5dc8751925d9c4f4e.png

详情页页面(点击列表页标题进入)

62d76530acd40561b52816da37eb5ffe.png

梳理下逻辑

我们先根据分页获得某一页的列表页,然后爬取列表页的房价,然后进入详情页,爬取详情页的下列信息

0a199bf716c84333ceac0ec0567f84d7.png

d281bb048651c591777d7d9a6190d18c.png

爬取数据的通用流程

根据url请求页面,获取页面响应对象(也就是下面代码中的html_obj = requests.get(url=url, headers=headers))

将页面响应对象转化为etree/parsel对象 (tree = etree.HTML(html_obj))

定位要爬取的数据 (tree.xpath(’…’))

获取数据

持久化存储

代码

终于到了心心念念,激动人心的时刻啦~~ 上代码!!!哈哈哈

写了注释了,不过多解释

from collections import defaultdict

import requests

import pandas as pd

from lxml import etree

import re

# 获取到分页url的一个统一格式

url_all = 'https://chongqing.anjuke.com/sale/p{}-rd1/?kw=%E8%8A%B1%E6%BA%AA#filtersort'

# 请求头

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

}

def get_url_list(url): '''获取url列表 用于分页获取内容''' url_list = [url.format(i) for i in range(1, 21)] # 获取20页 return url_list

def get_page_etree(url, headers): '''得到页面的etree对象''' html_obj = requests.get(url=url, headers=headers)# 根据url请求页面,获取页面响应对象html_obj html_obj = html_obj.content.decode() # 解决乱码问题 tree = etree.HTML(html_obj) # 转化为页面的etree对象 return tree

def get_data(tree): """获取一页的房子数据""" # 建立字典 info_dicts = defaultdict(list) # 定位到一页列表页的所有li标签 li_list = tree.xpath('//ul[@id="houselist-mod-new"]/li') for li in li_list: # 遍历每一条(li标签) 一个li就对应着一个房子 一个房子的数据全部爬取完再爬取下一个房子,一页爬取完再爬下一页 # 列表页 获取价格 jiage = li.xpath('./div[@class="pro-price"]//strong/text()')[0] info_dicts['价格(万)'].append(jiage) # 接下来进入详情页 获取其他数据 # 先获取a链接href属性值 再跳转到该链接进行爬取 a = li.xpath('.//div[@class="house-title"]/a/@href')[0] # 获取详情页etree对象 tree_i = get_page_etree(url=a, headers=headers) # 解析数据 hx = tree_i.xpath('//ul[@class="houseInfo-detail-list clearfix"]/li[2]/div[2]/text()')[0].strip().split() info_dicts['户型-房间'].append(hx[0]) info_dicts['户型-厅'].append(hx[1]) info_dicts['户型-卫生'].append(hx[2]) # 建筑面积 mj = tree_i.xpath('//ul[@class="houseInfo-detail-list clearfix"]/li[5]/div[2]/text()')[0] info_dicts['建筑面积'].append(mj) # 朝向 cx = tree_i.xpath('//ul[@class="houseInfo-detail-list clearfix"]/li[8]/div[2]/text()')[0] info_dicts['朝向'].append(cx) # 小区 xq = tree_i.xpath('//ul[@class="houseInfo-detail-list clearfix"]/li[1]/div[2]/a/text()')[0].strip() info_dicts['小区'].append(xq) # 地址 dz = tree_i.xpath('//ul[@class="houseInfo-detail-list clearfix"]/li[4]/div[2]/p/text()')[1].strip().split()[1] info_dicts['地址'].append(dz) # 建筑时间 jzsj = tree_i.xpath('//ul[@class="houseInfo-detail-list clearfix"]/li[7]/div[2]/text()')[0].strip() info_dicts['建筑时间'].append(jzsj) # 总楼层 所处层数 str = tree_i.xpath('//ul[@class="houseInfo-detail-list clearfix"]/li[11]/div[2]/text()')[0] zlc = re.search(r'\d+', str, re.A).group() # 这里用到了正则表达式提取信息 info_dicts['总楼层'].append(zlc) cs = re.search(r"['高','中','低']", str, re.U) if cs is None: cs = '' else: cs = cs.group() info_dicts['所处层数'].append(cs) # 装修 zx = tree_i.xpath('//ul[@class="houseInfo-detail-list clearfix"]/li[12]/div[2]/text()')[0] info_dicts['装修'].append(zx) # 电梯 dt = tree_i.xpath('//ul[@class="houseInfo-detail-list clearfix"]/li[14]/div[2]/text()')[0] info_dicts['电梯'].append(dt) data = pd.DataFrame(info_dicts) return data

# 主程序部分

data = pd.DataFrame()

# 获取url列表 用于分页爬取

url_list = get_url_list(url_all)

for i, url in enumerate(url_list): # 获取每一页的列表页etree对象 tree = get_page_etree(url=url,headers=headers) # 得到所有数据追加到data中 data = data.append(get_data(tree),ignore_index=True) print('第',i+1,'页爬取成功!')

# 持久化存储

data.to_excel('重庆花溪房源数据.xls')1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

请求头

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

}1

2

3

这里从这里找,复制 粘贴它

f920d5cccb688d7e857c977cdff7a60e.png

代码的问题 & 运行时可能出现的问题

存数据是爬到所有数据一次从DataFrame存到excel里,如果数据太大可能内存会吃不消,可以自己尝试下一页一追加到excel里,我这个20页(页数可以改的哈)1200条数据也还可以,数据量不大

如果报错就从网页手动访问页面,看是不是被人家的系统检测到你爬取了,就像下面这样 就换个网 刷新下页面能访问到列表页 再运行程序爬取

52102d7b8667018dec74c5320b048181.png

或者可能会出现验证码,手动通过验证码 ,刷新页面,再爬取就ok

建议多刷新下页面试试,能手动的访问到列表页一般就能正常爬下数据来

结果

36b6ada96e5f4eea33dba71b54555c26.png

(电梯那一栏 有“满三年”值 是因为 不是所有房子的详情页的是否有电梯那个数据都在同一位置上,他那个格式不是很统一,就会爬错)

爬虫学习视频推荐,我从B站这个视频学了学,觉得不错附上链接

https://www.bilibili.com/video/BV1Yh411o7Sz?t=825&p=25

xpath语法讲挺好的视频:https://www.bilibili.com/video/BV14K411L7T5 (就是打广告有点多~~)

加油,你是最胖的,欧耶~~

转载请附上我的链接哦~

欢迎点赞+转发+评论+讨论~~

感谢支持~

数据处理部分(写给我自己哒~)

import pandas as pd

data = pd.read_excel(r'C:/Users/user/Desktop/housePrice.xls')

# 处理缺失值

data = data.dropna(axis=0,subset=['所处层数'])

# 处理 电梯 异常值

data = data[data['电梯']!='满三年']

# 字符型改成数值型数据

# 小区

xq = data['小区'].unique()

xq_dict = {value:key for key, value in enumerate(xq)}

print(xq_dict)

data['小区'] = [xq_dict[i] for i in data['小区']]

# 朝向

cx = data['朝向'].unique()

cx_dict = {value:key for key, value in enumerate(cx)}

print(cx_dict)

data['朝向'] = [cx_dict[i] for i in data['朝向']]

# 地址

dz = data['地址'].unique()

dz_dict = {value:key for key, value in enumerate(dz)}

print(dz_dict)

data['地址'] = [dz_dict[i] for i in data['地址']]

# 所处层数

cs = data['所处层数'].unique()

cs_dict = {value:key for key, value in enumerate(cs)}

print(cs_dict)

data['所处层数'] = [cs_dict[i] for i in data['所处层数']]

# 装修

zx = data['装修'].unique()

zx_dict = {value:key for key, value in enumerate(zx)}

print(zx_dict)

data['装修'] = [zx_dict[i] for i in data['装修']]

# 电梯

dt = data['电梯'].unique()

dt_dict = {value:key for key, value in enumerate(dt)}

print(dt_dict)

data['电梯'] = [dt_dict[i] for i in data['电梯']]

data.to_excel('housePrice.xlsx')

# print(data)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

{‘溪山玥’: 0, ‘申烨太阳城’: 1, ‘日月山庄’: 2, ‘宗申动力城’: 3, ‘碧桂园渝南首府’: 4, ‘宗申青年国际’: 5, ‘浣溪锦云’: 6, ‘华润澜山望’: 7, ‘东原桐麓’: 8, ‘芸峰兰亭’: 9, ‘东海定南山’: 10, ‘曦圆丽景’: 11, ‘保利林语溪’: 12, ‘蔚蓝时光’: 13}

{‘南’: 0, ‘南北’: 1, ‘东南’: 2, ‘北’: 3, ‘东’: 4, ‘西南’: 5, ‘东北’: 6, ‘西北’: 7, ‘西’: 8}

{‘渝南分流道’: 0, ‘渝南大道158号附45号’: 1, ‘渝南大道118号’: 2, ‘渝南大道130号’: 3, ‘渝南大道91号’: 4, ‘渝南大道158号’: 5, ‘渝南大道129号’: 6, ‘龙鸣路’: 7, ‘渝南大道123号’: 8, ‘龙洲大道1958号’: 9, ‘渝南大道115号’: 10, ‘青龙湾路’: 11, ‘渝南大道9号’: 12, ‘渝南大道8号’: 13}

{‘中’: 0, ‘低’: 1, ‘高’: 2}

{‘毛坯’: 0, ‘精装修’: 1, ‘简单装修’: 2, ‘豪华装修’: 3}

{‘有’: 0, ‘无’: 1}

文章来源: blog.csdn.net,作者:静静_jingjing,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_39321513/article/details/111656257

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 安居客出租房(武汉为例)爬虫+数据分析+可视化 这个爬虫是我前段时间在淘宝上做单子的时候遇见的一个客户需求。本来以为就是一个简单的爬虫项目。但后面客户加了数据清洗和数据分析的要求。而后又加了要详细代码解释的需求等等。直到最后客户坦白说这是他们大专的毕设.......但是这个单子坐下来只有200左右,我想了一下,感觉好亏啊。在淘宝上随便找一个做毕设的都要好多钱的,而且客户本身的代码能力、数学、逻辑能力都很差,导致我每行都给注释以及看不懂,在我交付代码后又纠缠了我一个多礼拜。反正总体做下来的感觉就是烦躁。头一次感觉到了客户需求变更带来的巨大麻烦。 总之这是一次不是很愉快的爬虫经历。但是作为我写爬虫以来注释最详细的一次,以及第一次真正使用像matplotlib这种数据分析库的代码,我认为还是有必要分享出来给大家当个参考的(PS:大佬轻拍~)。爬虫本身几乎没有什么难度,写的也比较乱,敬请见谅。 **功能** 爬取安居客上的出租房信息(武汉地区的),并通过爬取的数据进行数据清洗以及数据分析。给出四个不同层面的可视化图。最终结果如下图所示: ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/1.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/2.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/3.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/4.png) **环境** 1. Windows 10 2. python3.7 **使用方法** 首先声明该爬虫由于是特定情况下写的,所以本身的通用性特别差,仅可以对安居客网站上的武汉的出租房信息进行爬取,且需要自己手动更新cookie。同时在对数据进行分析及可视化的时候由于也是特别针对武汉出租房的进行的,所以针对性也比较强。如果别的需求需要自己进行更改。 1. 访问[安居客网址](https://wuhan.anjuke.com/),获取cookie。 > tip:获取cookie的方法可根据[此链接](https://jingyan.baidu.com/article/5d368d1ea6c6e33f60c057ef.html) 2. 在项目中找到`spider.py`的文件,将第12行的cookie换成你自己的cookie。 3. 运行`spider.py`,获取房源信息。运行后应会产生一个`武汉出租房源情况.csv`的文件。此文件为我们从安居客爬取房源信息,其中包含`房屋租住链接、房屋描述、房屋地址、房屋详情(户型)以及经纪人、房屋价格`五个属性。 4. 在获取了数据之后我们运行`matplotlib.py`文件。进行数据清洗,分析,可视化。运行后即可获得**功能**中展示四个图片。 **技术栈** 1. request 2. parsel 3. pandas 4. matplotlib **进步(相比之前)** 此次爬虫相比之前的技术上可以说有减无增。但其中注释相当详细,可谓是每行代码都有注释。所以对于初学者应该有一些用处。同时使用matplotlib进行了数据分析可视化等。对于数据处理的代码的注释也是几乎每行都有注释的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值