Python爬虫入门案例之爬取二手房源数据
1. 爬虫介绍
在互联网时代,信息非常发达,我们可以从网上获取大量的有价值的信息,比如商品价格、股票走势、人口普查数据等等。这些数据对于学术研究、商业决策等方面都有很多的用处,而爬虫技术可以让我们从网络中提取需要的数据。
简单来说,爬虫技术就是通过程序自动访问网页、获取信息的技术。Python是非常适合爬虫编写的语言,因为Python有很多的爬虫库,而且使用Python编写的爬虫程序很容易理解,代码也很简洁。
2. 爬取二手房源数据步骤
想要爬取二手房源数据,需要先了解一下整个流程,以下是爬取二手房源数据的步骤:
2.1 确定爬取目标
首先需要确定要爬取哪个网站的数据,比如链家二手房网站。在确定网站之后,需要了解一下该网站的网页结构,确定数据的所在位置。
2.2 发送请求并获取HTML
需要使用Python代码向网站发送请求,并获取到该网站的HTML页面。发送请求可以使用requests库,获取HTML可以使用BeautifulSoup库进行网页解析。
import requests
from bs4 import BeautifulSoup
url = 'https://bj.lianjia.com/ershoufang/' # 网站地址
res = requests.get(url) # 发送请求
html = res.text # 获取HTML
soup = BeautifulSoup(html, 'html.parser') # 网页解析
2.3 解析HTML找到目标数据
在获取到HTML之后,需要使用BeautifulSoup库对HTML进行解析,找到需要的数据所在的位置,通过查看HTML文本中数据的标签和属性,递归查找并选定所需的信息节点。
house_info_list = [] # 存储房源信息的列表
house_list = soup.find_all('li', {'class': 'clear'}) # 定位到所有房源信息所在的标签
for house in house_list:
title_node = house.find('div', {'class': 'title'}) # 房源标题:名称、户型和面积
position_node = house.find('div', {'class': 'positionInfo'}) # 位置信息:小区和区域
price_node = house.find('div', {'class': 'totalPrice'}) # 房屋总价
unit_node = house.find('div', {'class': 'unitPrice'}) # 单价
house_info_list.append({
'title': title_node.text.strip(),
'community': position_node.a.text.strip(),
'district': position_node.contents[3].text.strip(),
'price': float(price_node.span.text.strip()),
'unit': int(unit_node.contents[0].strip())
})
2.4 存储数据
爬取到的数据需要进行存储,常用的方式有将数据存储到文件中、存储到数据库中等。这里以将数据存储到CSV文件中为例。
import csv
with open('house_info.csv', 'w', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f)
writer.writerow(['标题', '小区', '区域', '总价', '单价'])
for house in house_info_list:
row = [house['title'], house['community'], house['district'], house['price'], house['unit']]
writer.writerow(row)
3. 代码示例1:爬取链家二手房北京市区房源信息
import requests
from bs4 import BeautifulSoup
import csv
url = 'https://bj.lianjia.com/ershoufang/'
res = requests.get(url)
html = res.text
soup = BeautifulSoup(html, 'html.parser')
house_info_list = []
house_list = soup.find_all('li', {'class': 'clear'})
for house in house_list:
title_node = house.find('div', {'class': 'title'})
position_node = house.find('div', {'class': 'positionInfo'})
price_node = house.find('div', {'class': 'totalPrice'})
unit_node = house.find('div', {'class': 'unitPrice'})
house_info_list.append({
'title': title_node.text.strip(),
'community': position_node.a.text.strip(),
'district': position_node.contents[3].text.strip(),
'price': float(price_node.span.text.strip()),
'unit': int(unit_node.contents[0].strip())
})
with open('house_info.csv', 'w', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f)
writer.writerow(['标题', '小区', '区域', '总价', '单价'])
for house in house_info_list:
row = [house['title'], house['community'], house['district'], house['price'], house['unit']]
writer.writerow(row)
4. 代码示例2:爬取链家二手房城市的所有区县房源信息
import requests
from bs4 import BeautifulSoup
import csv
url = 'https://bj.lianjia.com/ershoufang/'
res = requests.get(url)
html = res.text
soup = BeautifulSoup(html, 'html.parser')
district_info_list = []
district_list = soup.select('div[data-role="ershoufang"] > div:first-of-type > a')
for district in district_list:
district_name = district.text
district_url = url + district['href']
district_res = requests.get(district_url)
district_html = district_res.text
district_soup = BeautifulSoup(district_html, 'html.parser')
house_info_list = []
house_list = district_soup.find_all('li', {'class': 'clear'})
for house in house_list:
title_node = house.find('div', {'class': 'title'})
position_node = house.find('div', {'class': 'positionInfo'})
price_node = house.find('div', {'class': 'totalPrice'})
unit_node = house.find('div', {'class': 'unitPrice'})
house_info_list.append({
'title': title_node.text.strip(),
'community': position_node.a.text.strip(),
'price': float(price_node.span.text.strip()),
'unit': int(unit_node.contents[0].strip())
})
district_info_list.append({
'district': district_name,
'house_info': house_info_list
})
with open('district_info.csv', 'w', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f)
writer.writerow(['区县', '标题', '小区', '总价', '单价'])
for district_info in district_info_list:
district = district_info['district']
house_info_list = district_info['house_info']
for house in house_info_list:
row = [district, house['title'], house['community'], house['price'], house['unit']]
writer.writerow(row)
以上两个示例代码分别实现了爬取链家二手房北京市区房源信息和爬取链家二手房城市的所有区县房源信息。通过以上两个示例可以看出,爬虫程序通过定位HTML标签、解析HTML文本,不仅可以获取单个网页的数据,而且可以自动化地获取多个网页的数据,大大提高了数据爬取的效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫入门案例之爬取二手房源数据 - Python技术站