一、项目背景
本项目是用python爬虫来实现爬取链家网青城山的二手房信息,我们小组是针对于在我们成都东软学院周边的二手房信息做一个数据爬取和建表。我们小组做这个项目的背景是因为在不久的将来,我们大学生将会离开校园步入社会,是为了我们大学生能够更好的去了解房子。
二、代码解析
首先调用requests,xlwt,BeautifulSoup库。requests库可以很方便的向网页服务器发送请求和获取网页数据。xlwt库用于导出excel使用的库。BeautifulSoup库用于解析网站。
打开需要爬取的网页,使用f12从网络里找到标头,然后找到它的请求URL和请求标头的User-Agent。再利用get请求获取网页数据,判断是否得到,如果没有得到则会显示获取网页数据失败。
import requests
import xlwt
from bs4 import BeautifulSoup
def getHouseList(url):
house = []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'}
# get请求获取网页数据
result = requests.get(url, headers=headers)
if (0 != result):
print('获取网页数据成功')
else:
print('获取网页数据失败')
接下来使用BeautifulSoup库对网页进行解析,再通过网页响应查找所需要的参数。通过遍历使房源的title解析出标题和网页的超链接,获得小区名称,户型,平米,总价和价格
# 使用BeautifulSoup解析获取到的
soup = BeautifulSoup(result.content, 'html.parser')
# 房源title
housename_divs = soup.find_all('div', class_='title')
for housename_div in housename_divs:
housename_as = housename_div.find_all('a')#解析
for housename_a in housename_as:
housename = []
# 标题
housename.append(housename_a.get_text())
# 超链接
housename.append(housename_a.get('href'))
house.append(housename)
huseinfo_divs = soup.find_all('div', class_='houseInfo')
for i in range(len(huseinfo_divs)):
info = huseinfo_divs[i].get_text()
infos = info.split('|')
# 小区名称
house[i].append(infos[0])
# 户型
house[i].append(infos[1])
# 平米
house[i].append(infos[2])
# 查询总价
house_prices = soup.find_all('div', class_='totalPrice')
for i in range(len(house_prices)):
# 价格
price = house_prices[i].get_text()
house[i].append(price)
return house
同理我们可以同过遍历来获取剩下的信息
# 爬取房屋详细信息:所在区域、套内面积
def houseinfo(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.content, 'html.parser')
msg = []
# 所在区域
areainfos = soup.find_all('span', class_='info')
for areainfo in areainfos:
# 只需要获取第一个a标签的内容即可
area = areainfo.find('a')
if (not area):
continue
hrefStr = area['href']
if (hrefStr.startswith('javascript')):
continue
msg.append(area.get_text())
break
# 套内面积
infolist = soup.find_all('div', id='infoList')
num = []
for info in infolist:
cols = info.find_all('div', class_='col')#
for i in cols:
pingmi = i.get_text()
try:
a = float(pingmi[:-2])
num.append(a)
except ValueError:
continue
msg.append(sum(num))
return msg
接下来是主函数,由于我们之前就获取到了网页的URL,并且我们要爬取的是多个网页。我们通过分析就不难看出每个页面的URL都是有规律的,就是URL后面加上/pg+页码
所以我们使用遍历来改变它的URL,以达到我们的目的。在这一过程中我们只需要修改对应的参数来改变爬取的网页数。
这一部分为主函数
# 主函数
def main():
data = []
#爬取前三页的数据
for page in range(1,4):
print('开始抓取第{}页数据'.format(page))#format替换关键字参数
url = 'https://cd.lianjia.com/ershoufang/qingchengshan/pg{}/'.format(page)
houses = getHouseList(url)
for house in houses:
link = house[1]
if (not link or not link.startswith('http')):
continue
# 将套内面积、所在区域增加到房源信息
mianji = houseinfo(link)
house.extend(mianji)
data.extend(houses)
print('抓取完毕!,即将写入excel...')
writeExcel('青城山二手房.xls', data)
print('写入excel成功,excel生成路径为:%s' % '青城山二手房.xls')
在主函数中,startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。
extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新的houses列表扩展原来的houses列表)
下面是关于将房源信息写入excel的相关代码
# 将房源信息写入excel文件
def writeExcel(excelPath, houses):
workbook = xlwt.Workbook()
# 获取第一个sheet页
sheet = workbook.add_sheet('git')
row0 = ['标题', '链接地址', '户型', '面积', '朝向', '总价', '所属区域', '套内面积']
for i in range(0, len(row0)):
sheet.write(0, i, row0[i])
for i in range(0, len(houses)):
house = houses[i]
print(house)
for j in range(0, len(house)):
sheet.write(i + 1, j, house[j])
workbook.save(excelPath)
?
下面是完整的代码
import requests
import xlwt
from bs4 import BeautifulSoup
def getHouseList(url):
house = []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'}
# get请求获取网页数据
result = requests.get(url, headers=headers)
if (0 != result):
print('获取网页数据成功')
else:
print('获取网页数据失败')
# 使用BeautifulSoup解析获取到的
soup = BeautifulSoup(result.content, 'html.parser')
# 房源title
housename_divs = soup.find_all('div', class_='title')
for housename_div in housename_divs:
housename_as = housename_div.find_all('a')#解析
for housename_a in housename_as:
housename = []
# 标题
housename.append(housename_a.get_text())
# 超链接
housename.append(housename_a.get('href'))
house.append(housename)
huseinfo_divs = soup.find_all('div', class_='houseInfo')
for i in range(len(huseinfo_divs)):
info = huseinfo_divs[i].get_text()
infos = info.split('|')
# 小区名称
house[i].append(infos[0])
# 户型
house[i].append(infos[1])
# 平米
house[i].append(infos[2])
# 查询总价
house_prices = soup.find_all('div', class_='totalPrice')
for i in range(len(house_prices)):
# 价格
price = house_prices[i].get_text()
house[i].append(price)
return house
# 爬取房屋详细信息:所在区域、套内面积
def houseinfo(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.content, 'html.parser')
msg = []
# 所在区域
areainfos = soup.find_all('span', class_='info')
for areainfo in areainfos:
# 只需要获取第一个a标签的内容即可
area = areainfo.find('a')
if (not area):
continue
hrefStr = area['href']
if (hrefStr.startswith('javascript')):
continue
msg.append(area.get_text())
break
# 套内面积
infolist = soup.find_all('div', id='infoList')
num = []
for info in infolist:
cols = info.find_all('div', class_='col')#
for i in cols:
pingmi = i.get_text()
try:
a = float(pingmi[:-2])
num.append(a)
except ValueError:
continue
msg.append(sum(num))
return msg
# 将房源信息写入excel文件
def writeExcel(excelPath, houses):
workbook = xlwt.Workbook()
# 获取第一个sheet页
sheet = workbook.add_sheet('git')
row0 = ['标题', '链接地址', '户型', '面积', '朝向', '总价', '所属区域', '套内面积']
for i in range(0, len(row0)):
sheet.write(0, i, row0[i])
for i in range(0, len(houses)):
house = houses[i]
print(house)
for j in range(0, len(house)):
sheet.write(i + 1, j, house[j])
workbook.save(excelPath)
# 主函数
def main():
data = []
#爬取前三页的数据
for page in range(1,4):
print('开始抓取第{}页数据'.format(page))#format替换关键字参数
url = 'https://cd.lianjia.com/ershoufang/qingchengshan/pg{}/'.format(page)
houses = getHouseList(url)
for house in houses:
link = house[1]
if (not link or not link.startswith('http')):
continue
# 将套内面积、所在区域增加到房源信息
mianji = houseinfo(link)
house.extend(mianji)
data.extend(houses)
print('抓取完毕!,即将写入excel...')
writeExcel('青城山二手房.xls', data)
print('写入excel成功,excel生成路径为:%s' % '青城山二手房.xls')
if __name__ == '__main__':
main()
三、运行效果
接下来是代码的运行效果
?
?
|