600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 【爬虫】爬取链家网青城山二手房源信息

【爬虫】爬取链家网青城山二手房源信息

时间:2020-09-04 20:36:38

相关推荐

【爬虫】爬取链家网青城山二手房源信息

一、项目背景

本项目是用python爬虫来实现爬取链家网青城山的二手房信息,我们小组是针对于在我们成都东软学院周边的二手房信息做一个数据爬取和建表。我们小组做这个项目的背景是因为在不久的将来,我们大学生将会离开校园步入社会,是为了我们大学生能够更好的去了解房子。

二、代码解析

首先调用requests,xlwt,BeautifulSoup库。requests库可以很方便的向网页服务器发送请求和获取网页数据。xlwt库用于导出excel使用的库。BeautifulSoup库用于解析网站。

打开需要爬取的网页,使用f12从网络里找到标头,然后找到它的请求URL和请求标头的User-Agent。再利用get请求获取网页数据,判断是否得到,如果没有得到则会显示获取网页数据失败。

import requestsimport xlwtfrom bs4 import BeautifulSoupdef 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')# 房源titlehousename_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):continuehrefStr = area['href']if (hrefStr.startswith('javascript')):continuemsg.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:continuemsg.append(sum(num))return msg

接下来是主函数,由于我们之前就获取到了网页的URL,并且我们要爬取的是多个网页。我们通过分析就不难看出每个页面的URL都是有规律的,就是URL后面加上/pg+页码

所以我们使用遍历来改变它的URL,以达到我们的目的。在这一过程中我们只需要修改对应的参数来改变爬取的网页数。

这一部分为主函数

# 主函数def main():data = []#爬取前三页的数据for page in range(1,4):print('开始抓取第{}页数据'.format(page))#format替换关键字参数url = '/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 requestsimport xlwtfrom bs4 import BeautifulSoupdef 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')# 房源titlehousename_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):continuehrefStr = area['href']if (hrefStr.startswith('javascript')):continuemsg.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:continuemsg.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 = '/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()

三、运行效果

接下来是代码的运行效果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。