Xpath插件的安装

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

提取码:qvzf

将这个安装包解压缩

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

看下图操作

就会出现这个

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

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

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

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

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

列表页页面

列表页的分页按钮

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

梳理下逻辑

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

爬取数据的通用流程

根据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

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

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

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

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

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

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

结果

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

爬虫学习视频推荐,我从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

python爬虫爬取房源_python爬虫爬取安居客房源信息相关推荐

  1. python爬虫爬取安居客房源信息

    爬取安居客房源信息 Xpath插件的安装 爬取重庆花溪附近的房源信息(进入正题啦~) 梳理下逻辑 爬取数据的通用流程 代码 代码的问题 & 运行时可能出现的问题 结果 数据处理部分(写给我自己 ...

  2. 爬虫项目--爬取安居客二手房信息

    爬虫实战(爬取安居客二手房信息-成都天府新区) 环境:python3.6 pycharm bs4库 解析方式:bs4 需求:爬取二手房信息字段(titile,house_type,build_time ...

  3. Python爬取安居客新房信息

    由于是刚开始学习Python爬虫,做个简单的爬虫,提供一个学习思路. 由于水平有限,正则表达式写的实在是抠脚,就直接上BeautifulSoup了. BeautifulSoup的学习参考http:// ...

  4. Python爬取安居客经纪人信息

    Python爬取安居客经纪人信息 Python2.7.15 今天我们来爬取安居客经纪人的信息.这次我们不再使用正则,我们使用beautifulsoup.不了解的可以先看一下这个文档,便于理解.http ...

  5. 爬取安居客租房信息,主要是获取电话号码

    爬取安居客租房信息,主要是获取电话号码 想要得到个人房源的电话只能在app上获取,而且获取的是虚拟号码,没什么作用.所以我们这次获取的是经纪人房源的电话号码,随便打开一个网页,可以看到. 他的电话号码 ...

  6. bs4+phantomjs爬取安居客二手房信息

    bs4+phantomjs爬取安居客二手房信息 这是我的第一篇博客,希望通过养成写博客的习惯来督促自己学习. 开发环境以及需要安装的模块 - Python3.6 - requests pip inst ...

  7. python爬取方式_Python 爬虫入门(三)—— 寻找合适的爬取策略

    写爬虫之前,首先要明确爬取的数据.然后,思考从哪些地方可以获取这些数据.下面以一个实际案例来说明,怎么寻找一个好的爬虫策略.(代码仅供学习交流,切勿用作商业或其他有害行为) 1).方式一:直接爬取网站 ...

  8. python 爬网站 实例_python爬虫实战:之爬取京东商城实例教程!(含源代码)

    前言: 本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧. 主要工具 scrapy BeautifulSoup requests 分析步骤 1 ...

  9. python爬虫微博评论图片_python爬虫爬取微博评论

    原标题:python爬虫爬取微博评论 python爬虫是程序员们一定会掌握的知识,练习python爬虫时,很多人会选择爬取微博练手.python爬虫微博根据微博存在于不同媒介上,所爬取的难度有差异,无 ...

  10. python爬虫爬取歌曲_python爬虫实战:爬取全站小说排行榜

    喜欢看小说的骚年们都知道,总是有一些小说让人耳目一新,不管是仙侠还是玄幻,前面更了几十章就成功圈了一大波粉丝,成功攀上飙升榜,热门榜等各种榜,扔几个栗子出来: 新笔趣阁是广大书友最值得收藏的网络小说阅 ...

最新文章

  1. pythonbool运算教学_python,_pandas Series bool与运算,python - phpStudy
  2. SOA标准发展混乱 国内业务缺少经验
  3. 11.python并发入门(part9 多进程模块multiprocessing基本用法)
  4. 正则表达式--元字符和限定词
  5. matlab有模糊分析,用matlab进行模糊综合评判_模糊综合评判matlab
  6. MySQL中GTID的几个限制和解决方案(r13笔记第21天)
  7. Python练习:用户登录(三次机会)
  8. 设计模式在项目中的应用案例_项目化学习案例(五):菊花种植的秘密——项目化学习在菊种植课程中的应用设计案例...
  9. python求最小值不能使用min和sotred_Python随手笔记第一篇(2)之初识列表和元组...
  10. 进销存web源码 php,PHP网络版进销存源码WEB进销存源码
  11. 2000坐标系与现行坐标系的关系及采用2000坐标系之后的一些变化
  12. 美国电话卡原生卡和虚商卡区别
  13. 关于智能名片小程序CRM系统,大家认为这种如何?
  14. java word 加水印_java如何给office加水印
  15. CP Editor 编辑器(为竞赛而生的编辑器)的安装与配置
  16. Espresso测试框架
  17. 每天一道算法题——拼音翻译成阿拉伯数字(只有数字拼音)
  18. 中国剩余定理(孙子定理)
  19. 第八期杭州NodeParty x Rokid技术分享会回顾
  20. seo网站推广优化,网站页面的SEO优化怎么做

热门文章

  1. 数据结构总结---------非线性表(多叉平衡树)
  2. uni-app默认集成功能模块
  3. 一个强大的开源的基于Spring Boot开发的Web支付系统项目,支持聚合码支付
  4. 笔试题:挖掘机技术哪家强
  5. C++简化布尔变量赋值
  6. Gym/100753 Divisions (大数分解质因数)
  7. VisualAssist v10.9.2463 Crack
  8. PTN970和PTN960 名称相同的接口板能否复用
  9. 使VirtualBox支持安装64位系统的解决办法
  10. 七个简单方法就能增强你的免疫力