爬虫实战——绝对通俗易懂,爬取房产数据
爬取房产数据
- 爬虫介绍
- 实战目标
- 1.获取url
- 2.利用BeautifulSoup获取html的索引
- 3.查找所需数据索引
- 4.正则表达式获取所需要的信息
- 完整代码
爬虫介绍
简单介绍一下爬虫,百度百科“网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。”
在我们这次的实战项目中,你需要了解的库有urllib,re,BeautifulSoup, request
实战目标
不说废话,直接说一下,本次爬虫实战的任务目标,就是爬取房产网站上的房产的价格,位置,房屋面积,装修情况等等网站上显示的信息。
这里以向租网举例,首先我们点到你想要爬取的网站页面,比如我们想知道黄浦区的所有写字楼的名称、面积和他的价格及其他信息,我们点到这个页面,红框里的就是我们想要获取的信息。
可以看一下,黄浦区的大厦一共有85页,我们的目标就是把这85内的每个楼盘的详细信息整理下来。
1.获取url
第一步我们首先要获取我们要抓取网站的url,翻到浏览器的网站
就可以看到网站的url了,这里我们看到page=85,整好所有的信息就只有85页,所以要获得每一个页面的url只需要改变等号后面的值就可以了。
接着,用request读取一下html的具体内容,不过在这之前,有一个点需要注意,作为企业肯定不想让你轻易地获得他的信息,有的企业有专门的防爬措施,那么如果要向去进行一个爬虫设计,第一就是要给自己做一个身份卡,让我们这个程序可以访问该网站的资源,最简单的措施就是让我们这个给我们这个软件的身份卡浏览器的身份,作为浏览器访问企业的资源是没有问题的。
利用google开发者模式,打开我们的目标网址向租网,按F12打开开发者模式,点击network后再点击左侧任意一个项目,接着在右侧的窗口上找到该浏览器访问目标网址的身份信息 Request Headers。
在该标题的子项目中找到user-agent,这个就是你访问该网站的实体对象,一般来说,用这个身份信息就足够了。
接着,用这个身份信息去获得该网页的html,代码如下所示。
import urllib
import re
from bs4 import BeautifulSoup
import pandas as pdurl = 'https://www.xiangzuwang.cn/xiezilou/sx/a803?page=1'
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}
request = urllib.request.Request(url, headers = head)
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
2.利用BeautifulSoup获取html的索引
Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。 Beautiful Soup 已成为和 lxml、html6lib 一样出色的 python 解释器,为用户灵活地提供不同的解析策略或强劲的速度。
上文获得了该网站的html后,利用BeautifulSoup来解析该html文档。
soup = BeautifulSoup(html,'html.parser')
这样我们就获得了一个BeautifulSoup的树模型,可以方便的查询所需要的数据了。
3.查找所需数据索引
这里我们回到我们的目标网站,F12打开开发者模式下的elements左边的小箭头来快速获得我们需要的信息的索引。
点完小箭头后点到网站所要获取的信息的具体内容处,在这里点到所在楼盘位置,他所在的html位置是div class=“address”,我们就利用这个索引获得其信息。
获取完索引信息后,用BeautifulSoup的find_all函数来定位到我们所要的信息。
soup.find_all('div', class_ = 'address')
这时候就返回了一个列表,观察列表中每三个元素是一个大厦的,这是因为在html里面,这三个元素的html索引地址是一样的,稍作处理让每一个元素就代表一个样本。
each = []
for i in range(int(len(soup.find_all('div', class_ = 'address'))/3)):str1 = str(soup.find_all('div', class_ = 'address')[3*i])str2 = str(soup.find_all('div', class_ = 'address')[3*i+1])str3 = str(soup.find_all('div', class_ = 'address')[3*i+2])each.append(str1+str2+str3)
each
这样就获得了一个元素代表一个样本的所有信息。
4.正则表达式获取所需要的信息
正则表达式的基本信息可以参考官方文档,在这里如果我们要获得大厦名字,我们给正则表达式制定好筛选
findlocation = re.compile(r' target="_blank">(.*?)<')
re.findall(findlocation, each[0])
# ['兰生大厦', '黄浦', '淮海中路']
在写一个循环把他加到列表里就完成了。
buildings = []
district = []
areas = []for i in each:buildings.append(re.findall(findlocation, i)[0])district.append(re.findall(findlocation, i)[1])areas.append(re.findall(findlocation, i)[2])
buildings
这样我们就完成了大厦名称的爬取,同理你可以获得街道,价格和面积及其他信息。注意这里只是简单一页的爬取,这个网页一共有85页,需要经过85页的循环获得全部数据。
最后,利用pands转化成数据框或者写入sql或者保存成你想要的格式就好了。
完整代码
# -*- coding: utf-8 -*-
import urllib
import re
from bs4 import BeautifulSoup
import pandas as pdbaseurl = 'https://www.xiangzuwang.cn/xiezilou/sx/a803?page='buildings = []
decoration = []
district = []
domain = []
areas = []
streets = []findlocation = re.compile(r' target="_blank">(.*?)<')
finddomain = re.compile(r'面积:(.*?)m²')
findecoration = re.compile(r'装修情况:(.*?)<')
findstreet = re.compile(r' (.*?) </div>')price_total = []
price_per = []
findprice_total = re.compile(r'价格:(.*?)万 元/月')
findprice_per = re.compile(r'单价:(.*?)元/m²/天') for page in range(1, 86):# 读取每一页urlurl = baseurl + str(page)head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}request = urllib.request.Request(url, headers = head)response = urllib.request.urlopen(request)html = response.read().decode('utf-8')soup = BeautifulSoup(html,'html.parser')# 整理一页的信息each = []for i in range(int(len(soup.find_all('div', class_ = 'address'))/3)):str1 = str(soup.find_all('div', class_ = 'address')[3*i])str2 = str(soup.find_all('div', class_ = 'address')[3*i+1])str3 = str(soup.find_all('div', class_ = 'address')[3*i+2])each.append(str1+str2+str3)# 获得信息for i in each:buildings.append(re.findall(findlocation, i)[0])district.append(re.findall(findlocation, i)[1])areas.append(re.findall(findlocation, i)[2])decoration.append(re.findall(findecoration, i)[0])domain.append(re.findall(finddomain, i)[0])streets.append(re.findall(findstreet, i)[0])for price in soup.find_all('div', class_ = 'mianji'):price = str(price)price_total.append(re.findall(findprice_total, price)[0])price_per.append(re.findall(findprice_per, price)[0])# 保存导出数据
raw_data = pd.DataFrame({'buildings':buildings,'decoration': decoration,'district':district,'domain': domain,'areas':areas,'streets':streets,'price_total':price_total,'price_per':price_per
})
raw_data
爬虫实战——绝对通俗易懂,爬取房产数据相关推荐
- python爬取喜马拉雅_Python爬虫实战案例之爬取喜马拉雅音频数据详解
这篇文章我们来讲一下在网站建设中,Python爬虫实战案例之爬取喜马拉雅音频数据详解.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 前言 喜马拉雅是专业的音频分享平台,汇集 ...
- python爬虫实战之异步爬取数据
python爬虫实战之异步爬取数据 文章目录 前言 一.需求 二.使用步骤 1.思路 2.引入库 3.代码如下 总结 前言 python中异步编程的主要三种方法:回调函数.生成器函数.线程大法. 以进 ...
- python爬虫实战之多线程爬取前程无忧简历
python爬虫实战之多线程爬取前程无忧简历 import requests import re import threading import time from queue import Queu ...
- 爬虫实战4:爬取猫眼电影排名Top100的详细数据保存到csv文件
申明:资料来源于网络及书本,通过理解.实践.整理成学习笔记. 文章目录 猫眼电影 完整代码 运行结果 猫眼电影 完整代码 import time import requests import re i ...
- 爬虫实战6:爬取英雄联盟官网五个位置的综合排行榜保存到excel
申明:资料来源于网络及书本,通过理解.实践.整理成学习笔记. 文章目录 英雄联盟官网 获取一个位置的综合排行榜所有数据(上单为例) 获取所有位置的综合排行榜所有数据 英雄联盟官网 获取一个位置的综合排 ...
- python爬网易新闻_Python爬虫实战教程:爬取网易新闻;爬虫精选 高手技巧
Python爬虫实战教程:爬取网易新闻:爬虫精选 高手技巧 发布时间:2020-02-21 17:42:43 前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有, ...
- Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索
Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索 一.资源 为什么接下来的代码中要使用el.getElementsByTa ...
- 转 Python爬虫实战一之爬取糗事百科段子
静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...
- 《python爬虫实战》:爬取贴吧上的帖子
<python爬虫实战>:爬取贴吧上的帖子 经过前面两篇例子的练习,自己也对爬虫有了一定的经验. 由于目前还没有利用BeautifulSoup库,因此关于爬虫的难点还是正则表达式的书写. ...
最新文章
- 哈工大 c语言测试与系统控制 ad,哈工大——c语言在测量与控制中应用实验报告.pdf...
- 交换两个数组的元素使之总和的差值最小
- java基础--java.util.Date类型小结
- ELK三件套安装实践之路(1)
- 刘宇凡:自媒体不是自媒体 应是志媒体
- OpenCV输出版本和构建配置的实例(附完整代码)
- 安卓BLE开发教程(二) BLE开发流程
- CentOS 7 安装 Python 3.6
- Sharding-Sphere,Sharding-JDBC_分库分表(水平分库_水平分表)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记004
- 北漂程序员,何以露宿街头?
- 列线图实现预测模型可视化
- VMware.exe应用程序错误--应用程序无法正常启动(0xc000007b)错误解决方法
- 飞信怎么登陆总是显示服务器错误咋回事,手机飞信无法登陆怎么办 飞信无法登陆解决方法...
- docker-compose Seata+Nacos部署
- 淘宝客如何通过小红书引流?如何找出你的目标人群有哪些?
- web CSS 颜色渐变代码
- Python王者荣耀皮肤批量下载
- 华为ENSP安装介绍(高效解决#####,40问题)
- Bresenham画线算法笔记
- 【从零开始学爬虫】采集收视率排行数据
热门文章
- F2FS 基础知识二
- Ngrok 实现内网穿透教程(Ngrok 和 Sunny-Ngrok )
- Java笨狗的C/C++
- 广州2年php8k,2年后,那位月入3000月供3400的广州女孩,终于被我们找到了
- [宋史学习] 赵元僖
- 搭建 ownCloud 私有云教程
- 新编计算机科学概论考试,热门计算机科学概论论文题目 计算机科学概论论文题目怎么定...
- 如何解决Error while saving file: Unable to open database file问题
- 机器学习分类器——案例(opencv sklearn svm ann)
- 基于.Net TcpListener 实现 WebSocketServer 通讯