大学的第一个作品

爬虫爬取住房信息并进行住房推荐,这是我大学的第一个作品,这个作品也是我头一次和别的班的小伙伴一起完成的一个作品。完成过程,对我来说比较艰辛,毕竟是半学半做赶出来的成果,我们小组一共3人,我做数据获取,1人做算法,1人做网站。最后的成果,还是很让我们满意的,在学校内获得了一等奖,在省里获得了3等奖(参与奖)  毕竟能力摆在那里。最后获得的奖金是一共700元,因为队长的分数要多一些,所以我得100元,其他人各拿300元。

好了,现在开始来介绍我们的作品吧。我们项目的目的是将好的房源推荐给合适的人群,这样能大大减少人们租房、买房的困难性。我们的项目所使用的语言有:python,C++,HTML,CSS,JS,mysql。所使用的核心算法是:决策树分析法。

你没有看错,看上去好像是如此的简单,但却耗费了我们无数心思。在制作作品期间,每天都是坐在电脑前,不是打游戏,而是学习各种操作和算法,真的是那种逼着自己学的感觉,也有一种很后悔的心,想着为什么寒假不提前学习,要等到这个时候来抢救

这一次的经历给了我很多的启发,首先,做事要做好充分的准备再去开始,不能是说,自己半吊子水平还在那里磨蹭。第二呢,就是做项目一定要留有版本,这样在做完改动以后,你还能找到上一个版本的东西。最后呢,技术是基础,最重要的东西是想法!技术不会可以去学,但是想法不出众,那也是白费的。

那现在,我在这里介绍一下我作品的部分吧,也就是爬虫部分。首先要做的前期准备工作,打开cmd 或者 打开Windows powershell 使用命令 pip install xxx    我们这里要安装的有 关于网络爬虫的 requests 、bs4,关于存放数据的表格的 xlwt、xlrd、xlsxwriter,关于制作界面的 PyQt5, 这些是要通过pip 安装才能使用的,然后系统自带的函数库有 sys 和 os 。

我们先想好获取房子信息的地方,比如安居客这个网站还是比较好下手的地方,所以我们去这个网站踩踩点。

上图中所标注的地方是我们需要注意的点,首先房子的信息,房子的名称,房价,竣工时间,和地址,还有就是图片。让后F12打开控制台,或者对准元素按右键检查元素,可以找到我们要的信息在哪个位置记录下来。好的,现在可以开始工作了。

def main(area):
    url = "https://{}.anjuke.com/community/p"   # 获取网页的url
    res = get_info(url.format(area))          # 将得到的url传入 get_info()函数,返回我们需要的信息
    save(res, area)                           #将我们得到的信息传入save函数中进行保存。

以上是主函数,然后开始写子函数:

def get_info(url):   # 获取网页信息
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'}
    re = []
    for i in range(1, 11):
        re.append(requests.get(url+str(i), headers=headers))
    return re

def save(res, area):    # 对获取的信息进行保存
    info_list = []
    suggestions = []
    list1 = ["小区名字", "地址", "竣工时间", "价格"]         # 保存数据
    workbook = xlwt.Workbook()                          #创建Excel实例
    sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
    sheet2 = workbook.add_sheet('sheet2', cell_overwrite_ok=True)
    i = 0
    while i < 4:
        sheet1.write(0, i, list1[i])
        sheet2.write(0, i, list1[i])
        i += 1
    i = 1
    for re in res:
        soup = BeautifulSoup(re.text, "html.parser")
        house_list = soup.find_all("div", class_="li-itemmod")
        for house in house_list:
            x = {}
            name = house.find("div", class_="li-info").a.text.strip()
            x["name"] = name
            price = house.find('div', class_="li-side").p.text.strip().replace("元/平米", "")
            x["price"] = float(price)
            address = house.find("div", class_="li-info").address.text.strip()
            x["address"] = address
            date = house.find("div", class_="li-info").p.text.strip().replace("竣工日期", "").replace(":", "").replace("暂无数据", "0").replace("年", "")
            x["date"] = float(date)
            info_list.append(x)
            sheet1.write(i, 0, name)
            sheet1.write(i, 1, address)
            sheet1.write(i, 2, date)
            sheet1.write(i, 3, price)
            i += 1
    suggestions = Deal(info_list, i-1)
    i = 1
    for suggestion in suggestions:
        for key in range(0, 10):
            sheet2.write(i, 0, info_list[int(suggestion[0])]["name"])
            sheet2.write(i, 1, info_list[int(suggestion[0])]["address"])
            sheet2.write(i, 2, info_list[int(suggestion[0])]["date"])
            sheet2.write(i, 3, info_list[int(suggestion[0])]["price"])
        i += 1
        if i > 10:
            break
    location = "D:\\software_created\\{}.xls"
    workbook.save(location.format(area))            # 以xls格式保存
    os.startfile(location.format(area))
    os.startfile(location.format(area + "_beta"))
    print("创建完成")

以上是获取数据及其保存,然后,我们还需要做一个好看一点的界面(非必需),制作界面其实还挺容易的  时隔太久我也记不起来了,主要还是没有系统的学习,这个可以边看教程边学习,在哔哩哔哩可以找到,直接搜索PyQt5。

class Window(QWidget):      # 创建UI类
    def __init__(self):
        super().__init__()
        self.title = "住房信息爬取程序"
        self.top = 350
        self.left = 700
        self.width = 460
        self.height = 460
        self.area = ["nc", "beijing", "shanghai", "tianjin", "shenzhen", "guangzhou", "chengdu", "chongqing"]
        self.InitWindow()

    def InitWindow(self):       # UI窗口
        self.setWindowIcon(QtGui.QIcon("spider.png"))
        palette = QPalette()
        palette.setBrush(QPalette.Background, QBrush(QPixmap("background.jpg")))    # 设置背景图片
        self.setPalette(palette)
        self.resize(460, 255)
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.createLayout()
        vbox = QVBoxLayout()

        vbox.addWidget(self.groupBox)

        self.setLayout(vbox)
        self.show()

    def createLayout(self):     # 创建按钮等布局
        self.groupBox = QGroupBox("选择你想要查询的城市的房价!")
        # self.setFont(QtGui.QFont(c))
        grideLayout = QGridLayout()
        button1 = QPushButton("南昌", self)
        button1.setIcon(QtGui.QIcon("nc.png"))
        button1.setIconSize(QtCore.QSize(40, 40))
        button1.setMinimumHeight(40)
        grideLayout.addWidget(button1, 0, 0)
        button1.clicked.connect(self.Choose1)

        button2 = QPushButton("北京", self)
        button2.setIcon(QtGui.QIcon("beijing.png"))
        button2.setIconSize(QtCore.QSize(40, 40))
        button2.setMinimumHeight(40)
        grideLayout.addWidget(button2, 0, 1)
        button2.clicked.connect(self.Choose2)

        button3 = QPushButton("上海", self)
        button3.setIcon(QtGui.QIcon("shanghai.jpg"))
        button3.setIconSize(QtCore.QSize(40, 40))
        button3.setMinimumHeight(40)
        grideLayout.addWidget(button3, 1, 0)
        button3.clicked.connect(self.Choose3)

        button4 = QPushButton("天津", self)
        button4.setIcon(QtGui.QIcon("tianjin.jpg"))
        button4.setIconSize(QtCore.QSize(40, 40))
        button4.setMinimumHeight(40)
        grideLayout.addWidget(button4, 1, 1)
        button4.clicked.connect(self.Choose4)

        button5 = QPushButton("深圳", self)
        button5.setIcon(QtGui.QIcon("shenzhen.jpg"))
        button5.setIconSize(QtCore.QSize(40, 40))
        button5.setMinimumHeight(40)
        grideLayout.addWidget(button5, 2, 0)
        button5.clicked.connect(self.Choose5)

        button6 = QPushButton("广州", self)
        button6.setIcon(QtGui.QIcon("guangzhou.jpg"))
        button6.setIconSize(QtCore.QSize(40, 40))
        button6.setMinimumHeight(40)
        grideLayout.addWidget(button6, 2, 1)
        button6.clicked.connect(self.Choose6)

        button7 = QPushButton("成都", self)
        button7.setIcon(QtGui.QIcon("chengdu.jpg"))
        button7.setIconSize(QtCore.QSize(40, 40))
        button7.setMinimumHeight(40)
        grideLayout.addWidget(button7, 3, 0)
        button7.clicked.connect(self.Choose7)

        button8 = QPushButton("重庆", self)
        button8.setIcon(QtGui.QIcon("chongqing.jpg"))
        button8.setIconSize(QtCore.QSize(40, 40))
        button8.setMinimumHeight(40)
        grideLayout.addWidget(button8, 3, 1)
        button8.clicked.connect(self.Choose8)

        button9 = QPushButton("彩蛋", self)
        button9.setIcon(QtGui.QIcon("caidan.png"))
        button9.setIconSize(QtCore.QSize(40, 40))
        button9.setMinimumHeight(40)
        grideLayout.addWidget(button9, 4, 0)
        button9.clicked.connect(self.open_egg)

        button10 = QPushButton("结束应用", self)
        button10.setMinimumHeight(40)
        grideLayout.addWidget(button10, 4, 1)
        button10.clicked.connect(self.AppClose)

        self.groupBox.setLayout(grideLayout)

    def AppClose(self):
        sys.exit()
    # 按钮功能的实现
    def Choose1(self):
        self.Messagebox()
        main(self.area[0])
    def Choose2(self):
        self.Messagebox()
        main(self.area[1])
    def Choose3(self):
        self.Messagebox()
        main(self.area[2])
    def Choose4(self):
        self.Messagebox()
        main(self.area[3])
    def Choose5(self):
        self.Messagebox()
        main(self.area[4])
    def Choose6(self):
        self.Messagebox()
        main(self.area[5])
    def Choose7(self):
        self.Messagebox()
        main(self.area[6])
    def Choose8(self):
        self.Messagebox()
        main(self.area[7])

    def Messagebox(self):
        self.box = QMessageBox(QMessageBox.Information, '正在获取住房信息请耐心等待', '正在获取,稍后会为您自动打开\n(づ ̄3 ̄)づ╭❤~')
        self.box.addButton('好的 (๑•̀ㅂ•́)و✧', QMessageBox.YesRole)
        self.box.addButton('行吧 o(一︿一+)o', QMessageBox.NoRole)
        self.box.setIcon(1)
        self.box.setGeometry(700, 400, 0, 0)
        self.box.show()

    def open_egg(self):
        os.startfile("egg.png")
if __name__ == "__main__":
    App = QApplication(sys.argv)
    window = Window()
    sys.exit(App.exec())

这个是效果图

点击相应的内容就可以运行了。

初次做作品还有很多需要完善的地方,写blog 的次数也比较少,很多地方解释不清楚,请大家多多包涵,我也会继续努力为互联网做出微薄的贡献!!!

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00