python爬房源信息_python爬虫获取链家二手房源信息
0X00 前言
本来之前是准备爬取boss直聘的招聘信息,结果boss的反爬还挺恶心,访问页面还得带上cookie,页面的cookie有效时间也只有一分钟,不然只能访问到等待页面,菜鸡落泪
0X01 准备工作
使用到的标准库lxml、requests、re、requests.exceptions、os和openpyxl、random、time。
0X02 分析
相比较boss来说,链家的网站对于爬虫友好得多,当然访问的时候还是得带上headers,不然也是会被识别出来是爬虫,从而被拒绝访问。
分析一下链家的url,举一个例子。https://cd.lianjia.com/ershoufang/pg1rs双流区/。
他的子域名cd.lianjia.com中的cd就对应着成都市,想要访问其他城市的房源信息就可以通过修改它来达成。
后面路径中的pg1就对应着页数,可以通过修改它来达成翻页的效果。
而rs后面的信息就是我们搜索的内容。
很明显可以看出规律 https:// + city + .lianjia.com/ershoufang/pg +页码+ rs + 搜索内容/
url分析完了,来看看链家的页面:
每一条租房信息都存在一个li标签中。
然后可能是因为他的设置原因,不管数据有再多,也只会显示100页出来,一页30条信息,一共就是3000条信息。
简单分析了一下,就下来就是代码实现。
0X03 代码实现
首先定义了两个全局变量count和total_count,用来记录爬取的页数和爬取的数据总数。
global count
global total_count
还用到了time库来记录程序运行时间。
start = time.time()#开始时间
final = time.time()#结束时间
print('爬取完毕,共花费' + str(final - start) + 's.')
这的话由于爬取的页数为100页,就直接写死了循环次数。
如果不确定页数有多少的话可以通过判断response的信息来判断是否为有效url,或者可以通过获取第一个页面下的总页数从而得知总页数的数量,这偷了个懒。
为了防止访问过于频繁从而导致ip被ban,可以使用sleep将程序挂起几秒,避免访问过于频繁。
for i in range(1, 101):
url = 'https://cd.lianjia.com/ershoufang/pg' + str(i) + 'rs双流区/'
time.sleep(random.randint(0, 3))
main(url)
然后是简单的main函数。
通过get_one_page函数得到页面的返回信息,如果返回不为None,就调用
parse_page函数来解析数据,然后存入表格中。
def main(url):
html_data = get_one_page(url)
if html_data is not None:
parse_page(html_data)
为了防止被ban,多准备几个User-Agent,然后访问的时候随机从里面取一个出来放入headers。
def get_one_page(url):
try:
ua = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)"
]
headers = {"User-Agent": random.choice(ua)}
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
return response.text
else:
return None
except RequestException:
return None
然后就通过xpath来获取页面中我们想要的信息。
不过感觉这样显得好笨重,不知道有没有更简单的方法,害
data_text = etree.HTML(html_data)
description = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[1]/a/text()')
address = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[2]/div/a[1]/text()')
specific_situation = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[3]/div/text()')
total_price = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[6]/div[1]/span/text()')
unit_price = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[6]/div[2]/span/text()')
attention = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[4]/text()')
然后通过操作xlsx文件,将我们获得的信息全部存入文件当中。
0X04 完整代码
import os
import random
import time
import openpyxl
import requests
from requests.exceptions import RequestException
from lxml import etree
import re
def get_one_page(url):
try:
ua = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)"
]
headers = {"User-Agent": random.choice(ua)}
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
return response.text
else:
return None
except RequestException:
return None
def parse_page(html_data):
data_text = etree.HTML(html_data)
description = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[1]/a/text()')
address = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[2]/div/a[1]/text()')
specific_situation = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[3]/div/text()')
total_price = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[6]/div[1]/span/text()')
unit_price = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[6]/div[2]/span/text()')
attention = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[4]/text()')
# 打开文件
file_name = '成都市双流区二手房源.xlsx'
global total_count
# 判断文件是否存在
if os.path.exists(file_name):
wb = openpyxl.load_workbook(file_name)
print(file_name + '打开成功!')
ws = wb.active
else:
wb = openpyxl.Workbook() # 创建文件对象
print('文件' + file_name + '创建成功!')
ws = wb.active
ws.append(['房源描述', '地址', '房源情况', '规格', '面积', '总价(万)', '单价(元/平米)', '信息发布情况'])
for i in range(0, len(description)):
price = re.search('单价(\\d*?)元/平米', unit_price[i], flags=0)
list = specific_situation[i].split(' | ')
specification = list[0]
area = re.search('(.*)平米', list[1], flags=0).group(1)
ws.append(
[description[i], address[i], specific_situation[i], specification, area, total_price[i], price.group(1),
attention[i]])
total_count += 1
global count
count += 1
print('第' + str(count) + '页爬取成功!')
wb.save(filename=file_name)
def main(url):
html_data = get_one_page(url)
if html_data is not None:
parse_page(html_data)
if __name__ == '__main__':
global count
global total_count
count = 0
total_count = 0
start = time.time()
for i in range(1, 101):
url = 'https://cd.lianjia.com/ershoufang/pg' + str(i) + 'rs双流区/'
time.sleep(random.randint(0, 3))
main(url)
final = time.time()
print('爬取完毕,共花费' + str(final - start) + 's.')
print('共爬取' + str(count) + '页数据')
print('共爬取' + str(total_count) + '条数据')
0X05 成果图
下次应该会学一学python的数据分析来分析分析爬取到的数据?应该吧,应该不会鸽吧,害。
python爬房源信息_python爬虫获取链家二手房源信息相关推荐
- python爬取前程无忧_Python爬虫获取51job的51job代码,python,抓取,前程无忧
为了结果直观,做的简单 网页地址: https://search.51job.com/list/180200,000000,0000,00,9,99,%25E6%25AD%25A6%25E6%25B1 ...
- Python常用插件类举,lxml+Xpath实现爬虫,使用Xpath爬取链家二手房源信息
目录 一.XPath 二.XPath 常用规则 三.在谷歌浏览器安装XPath插件 四.Python爬虫常用插件 五.使用Xpath解析 六.Xpath匹配示例 1.查看所有的标签(如p.a.li标签 ...
- 手把手教你利用Python网络爬虫获取链家网的房产信息
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 夜阑卧听风吹雨,铁马冰河入梦来. ...
- python链家网爬虫_手把手教你利用Python网络爬虫获取链家网的房产信息
点击上方" Python爬虫与数据挖掘 ",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 夜阑卧听风吹雨,铁马冰河入梦来 ...
- python 爬视频下载_Python爬虫进阶之爬取某视频并下载的实现
这篇文章我们来讲一下在网站建设中,Python爬虫进阶之爬取某视频并下载的实现.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 这几天在家闲得无聊,意外的挖掘到了一个资源网站 ...
- python爬取网页内容_Python爬虫原理解析
笔者公众号:技术杂学铺 笔者网站:mwhitelab.com 本文将从何为爬虫.网页结构.python代码实现等方面逐步解析网络爬虫. 1. 何为爬虫 如今互联网上存储着大量的信息. 作为普通网民,我 ...
- python 爬网站 实例_python爬虫实战:之爬取京东商城实例教程!(含源代码)
前言: 本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧. 主要工具 scrapy BeautifulSoup requests 分析步骤 1 ...
- python爬京东联盟_python爬虫框架scrapy实战之爬取京东商城进阶篇
前言 之前的一篇文章已经讲过怎样获取链接,怎样获得参数了,详情请看python爬取京东商城普通篇,本文将详细介绍利用python爬虫框架scrapy如何爬取京东商城,下面话不多说了,来看看详细的介绍吧 ...
- 如何运用python爬游戏皮肤_Python爬虫练习:20行Python代码爬取王者荣耀全英雄皮肤...
引言王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. 准备工作 ...
- python爬取喜马拉雅_Python爬虫实战案例之爬取喜马拉雅音频数据详解
这篇文章我们来讲一下在网站建设中,Python爬虫实战案例之爬取喜马拉雅音频数据详解.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 前言 喜马拉雅是专业的音频分享平台,汇集 ...
最新文章
- 使用cmake组建跨平台项目
- python字典遍历的几种方法(for in 用法)
- 全文!《2018中国IoT报告》!
- 大数据可视化及发展趋势
- 如何定义一个有效的OWIN Startup Class
- 数字和为sum的方法数-01背包计数问题
- kvm虚拟化_KVM 虚拟化环境搭建 - WebVirtMgr
- docker镜像没有ifconfig、ping指令
- 执行文件mysql使用source 命令乱码问题
- QT5日志功能(qDebug、qWarnng、qCritical、qFatal)
- 可编程模拟IC之考虑[zz]
- UNP学习笔记3——基本UDP套接字编程
- 【LoadRunner】解决LR11无法录制Chrome浏览器脚本问题
- 修改MySQL用户的host属性_如何快速修改MySQL用户的host属性
- octave存储文档
- Redis源码分析之内存检测memtest
- 德龙钢铁大脑:更锐的眼,更快的脑
- Redis主从复制(master/slaver)
- 【洛谷】P1419 寻找段落
- python脚本控制ios手机app_iOS自动打包ipa(Python脚本)
热门文章
- Win7定时任务——提醒自己喝水
- 单片机复位电路的简谈
- 14年macmini装双硬盘_2011中Mac Mini详尽拆解 可装两块硬盘
- 关于电平转换电路1.8V转3.3V
- windows开机老显示请选择要启动的操作系统
- 你有多久没有看星星了呢?【爬取NASA的科普网站上的所有图片】
- android 读取sdcard图片 不显示,Android 读取sdcard上的图片实例(必看)
- python windows下载哪个_初识Python(windows)——下载、安装、使用
- html中heading标签,Heading标签优化实战经验分享
- Kubernetes上基于longhorn和statefulsets的pv空间扩展