IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【爬虫】爬取链家网青城山二手房源信息 -> 正文阅读

[Python知识库]【爬虫】爬取链家网青城山二手房源信息

一、项目背景

本项目是用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()

三、运行效果

接下来是代码的运行效果

?

?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:26:04  更:2021-12-24 18:26:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:38:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码