Python爬虫之爬取二手房信息
作者:世界的隐喻 发布时间:2021-08-11 19:40:50
前言
说到二手房信息,不知道你们心里最先跳出来的公司(网站)是什么,反正我心里第一个跳出来的是网站是 58 同城。哎呦,我这暴脾气,想到就赶紧去干。
但很显然,我失败了。说显然,而不是不幸,这是因为 58 同城是大公司,我这点本事爬不了数据是再正常不过的了。下面来看看 58 同城的反爬手段了。这是我爬取下来的网页源码。
我们看到爬取下来的源码有很多英文大写字母和数字是网页源码中没有的,后来我了解到 58 同城对自己的网站的源码进行了文本加密,所以就出现了我爬取到的情况。
爬取二手房信息
我打开 58 同城的 robots 协议。
好家伙,不愧是大公司,所有的 * 址都不让爬取,打扰了。我只好转头离开,去寻找可以让我这种小白爬取的二手房网站。于是我找到了c21网站,不知道是我的原因,还是别的原因,反正我是没有找到这个网站的 robots 协议。不管了,既然没找到,就默认没有吧,直接开始爬取。
我本来打算通过二手房的目录跳到一个具体信息,然后爬取二手房的一些基本信息和属性。
像我红笔圈起来的部分。但很可惜我失败了,后来我看了看红笔圈起来的部分的爬取到的源码。
好家伙,还可以这样。不过这怎么可以难倒机智的我?(其实我真不知道怎么解决它)。没关系,之前的源码里不是有类似的信息吗?我只好将就一下了。
然后是翻页。翻页问题很好解决,我们很快就发现网页都是 https://bj.c21.com.cn/ershoufang/pg2/。其中的页数和 pg 后面的数字有关。
然后就是分析这些数据源码的位置了。
首先,我们发现我们要爬取的数据全在 li 标签里,所以我们可以先获得 li 标签的列表。伪代码就像这样。
form lxml import etree
…… ……
tree = etree.HTML(源码)
li_list = tree.xpath( li 标签的路径)
这时候我们获得的就是 li 标签的 etree 的类,可以继续使用 etree 类里的函数。然后我们就可以利用 for 循环提出不同房源的 li 标签,根据自己的需要获取文本信息。
欧克,了解了这些(感觉源码前前后后就是四个字 ”我是菜鸡“ )我们就可以开始写代码了。
import requests
from lxml import etree
import re
if __name__ == "__main__":
# UA伪装
header = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
}
for pg in range(1, 3): # 翻两页
# 指定 url
url = "https://bj.c21.com.cn/ershoufang/pg%s/" % str(pg)
# 获取网页源码
page = requests.get(url = url, headers = header).text
# xpath 解析
tree = etree.HTML(page)
li_list = tree.xpath('//ul[@id="availability"]/li')
for li in li_list:
title = li.xpath('div[2]/div/a/text()')[0] # 房子的名称
# print(title[0]) # 测试
add = li.xpath('div[2]/div/p//a/text()') # 地址
add = add[-2: ] + add[0:1] # 地址范围由大到小
# print(add) # 测试
div_list = li.xpath('div[2]/div[2]/div')
# 具体信息
message_list = ["建筑面积", "房屋户型", "房屋朝向", "所在楼层", "装修情况", "建成时间"]
for i in range(6):
div = div_list[i]
message = div.xpath('span/text()')[0]
message = re.sub("\s", "", str(message)) # 因为发现获取的文本有很多换行符和空格,所以需要去掉
message = re.sub("\\n", "", str(message))
message_list[i] = message_list[i] + ":" + message
# print(message_list) # 测试
# 交通情况
traffic = li.xpath('div[2]/div[4]//text()')
# print(traffic) # 测试
# 价格情况
price = li.xpath('div[2]/div[3]//text()')
price = price[0] + price[1]
# print(price) # 测试
with open("C:\\Users\\ASUS\\Desktop\\CSDN\\数据解析\\xpath\\二手房\\" + "二手房.txt", "a", encoding = "utf-8") as fp:
fp.write(title + "\n")
for message in message_list:
fp.write(message + "\n")
if traffic == []:
fp.write("交通情况:无介绍" + "\n")
else:
fp.write("交通情况:" + traffic[0] + "\n")
fp.write("价格:" + price + "\n\n")
print(title, "下载完成!!!")
print("over!!!")
爬取结果
最后的运行结果就像这样
来源:https://blog.csdn.net/ShiJieDeYinYu/article/details/116138179


猜你喜欢
- 一、前言基于Mediapipe+Opencv实现手势检测,想实现一下姿态识别的时候,感觉手势识别也蛮重要的就过来顺便实现一下。下面是一些国内
- 目录什么是预处理?那么预处理有啥好处?Go实现 MySQL 的事务sqlx使用gin + mysql + rest full api&nbs
- 在制作一个 Python 分发包时经常需要把一些文件添加到包中。最常见的例子是你希望通过 pip install 命令安装 Pyt
- MYSQL常用命令1.导出整个数据库mysqldump -u 用户名 -p --default-character-set=latin1 数
- 手残更新Pycharm 2020.1 版时将配置文件都删除了😂;在此重新记录下配置!安装教程参考:idea2020.1最新版永久破解/pyc
- 蚁群算法简介蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agen
- 一、安装pip install pandas如果出报错,不能运行,可以安装pip install xlrd二、 代码如下import pan
- 尽管 xml.etree.ElementTree 库通常用来做解析工作,其实它也可以创建XML文档。 例如,考虑如下这个函数:from xm
- 一、了解FTP服务器FTP(文件传输协议),运行在tcp洗衣上,使用两个端口,即数据端口和命令端口,也称之为控制端口。默认情况下,20是数据
- 场景一、有一个输入金额的场景,这个金额需要验证,验证说明如下:不能为空格;不能为0;不能为汉字;不能为其它字符;不能大于200;唯一可以的是
- 正解使用useRouter:// router的 path: "/user/:uid"<template>
- 本文实例讲述了js+ajax实现获取文件大小的方法。分享给大家供大家参考,具体如下:顾名思义,通过JS和Ajax来获取上传文件的大小,在上传
- 面对不断成长的用户,跟随用户的脚步齐步向前,做引起共鸣的改变,去除低龄化的设计,用成熟稳重的心态面对用户。QQBanner自2006 年推出
- 1. 使用函数 np.random.random由于 np.random.random() 默认生成 0~1 之间的小数,因此需要转换一下如
- 准备在断网的和联网的机器安装pip,下载地址https://pypi.python.org/pypi/pip在联网的开发机器上安装好需要的包
- 1. vscode相关配置w3c school 手册: https://www.w3school.com.cn/html/inde
- 为了熟悉Python基础语法,学习了一个经典的案例:飞机大战,最后实现效果如下:实现步骤:①下载64位对应python版本的pygame:p
- 看到一篇Implementing an Infinite Scroll with Vue.js , 觉得挺实用的就看了下, 顺便简单翻译了一
- 前言我们在 django-rest-framework解析请求参数 文章中完成了接口文档到参数解析, 一个完整的流程中还
- 1.函数调用# 1.调用函数,需要知道函数的名称和参数# 2.调用函数传入的参数需要和函数定义的参数数量和类型一致# 如调用abs函数pri