• Forward团队-爬虫豆瓣top250项目-项目总结


    托管平台地址:https://github.com/xyhcq/top250

    小组名称:Forward团队

    组长:马壮

    成员:李志宇、刘子轩、年光宇、邢云淇、张良

    我们这次团队项目内容是爬取豆瓣电影TOP250的电影信息,为什么我们选这个项目作为团队项目呢?因为在这个大数据时代,我们总有一些信息需要收集保存,而手动收集信息会很麻烦,所以选了爬取豆瓣TOP250,其实,项目爬取什么网站、内容并不重要,因为我们在这次团队项目中学会了爬虫的工作原理,以后我们想爬取别的网站那都不是事了。

    这次团队项目中,我们都有了很大的收获,无论是组员中基础好的还是基础弱的,都是有收获的,可喜可贺!在团队项目中,我们遇到了很多大问题,对于我们来说,很多是可能导致我们项目失败的致命问题,好在经过组员们的不懈努力,刻苦学习,查资料解决了。

    程序的开发过程,我们就不提了,在之前的作业里,我们组都有详细的分析,都很详细,下面总结一些我们遇到的问题以及解决办法,这是我们团队项目中收获的最有价值的内容。

     在开发之初,我们选择了BeautifulSoup模块,需要在python里安装上这个模块,然而,单单给python安装模块就困扰了我们很久,网上有说用pip install命令安装的,可是当我们尝试时候发现,pip不好使,问了老师,老师说python自带pip的,于是我们在网上各种找资料,终于找到了解决方法:我们安装的python2.7.5里不自带pip,安装了新版本的python(我们试了2.7.11),终于成功解决了pip命令不好使,成功安装上了模块(这个问题浪费了我们好几天)

    安完模块,由于我们都是做爬虫零基础的菜鸟,所以我们又在网上找教程学习了一番。

    我们学习时候用到的参考资料:

    Python爬虫利器二之Beautiful Soup的用法

    Python中使用Beautiful Soup库的超详细教程

    Python 爬虫学习系列教程

    参考教程,练习BeautifulSoup实例

    于是我们第一版程序出炉

    复制代码
    复制代码
    # -*- coding:utf-8 -*-
    import requests
    from bs4 import BeautifulSoup
    import re
    import time
    import sys
    
    def getHTMLText(url,k):
        # 获取网页源代码
        try:
            if(k==0):
                kw={}
            else:
                kw={'start':k,'filter':''}
            # 保存获取的网页
            read = requests.get(url,params=kw,headers={'User-Agent': 'Mozilla/4.0'})
            read.raise_for_status()
            read.encoding = read.apparent_encoding
            return read.text
        except:
            print("获取失败!")
    
    def getData(html):
        # 分析代码信息,提取数据
        soup = BeautifulSoup(html, "html.parser")
    
        # 找到第一个class属性值为grid_view的ol标签
        movieList=soup.find('ol',attrs={'class':'grid_view'})
    
        # 找到所有的li标签
        for movieLi in movieList.find_all('li'):    
            # 找到第一个class属性值为hd的div标签
            movieHd=movieLi.find('div',attrs={'class':'hd'})
            # 找到第一个class属性值为title的span标签
    
            # 获取电影名字
            movieName=movieHd.find('span',attrs={'class':'title'}).getText()
            print movieName
    
            # 获取电影链接
            movieUrl=movieHd.find('a class="" href="')
            print movieUrl
    
    
            # 获取电影导演/演员
            movieBd = movieLi.find('div', attrs={'class': 'bd'})
            movieSF=movieBd.find('p',attrs={'class':''}).getText()
            print movieSF
    
    
            # 获取电影的评分
            movieScore=movieLi.find('span',attrs={'class':'rating_num'}).getText()
            print movieScore
    
            #获取电影的评论数
            movieEval=movieLi.find('div',attrs={'class':'star'})
            movieEvalNum=re.findall(r'd+',str(movieEval))[-1]
            print movieEvalNum
    
            # 获取电影短评
            movieQuote = movieLi.find('span', attrs={'class': 'inq'})
            # 有的电影没有短评,为防止报错,加次
            if(movieQuote):
                print movieQuote.getText()
            else:
                print ('没有短评!')
    
    
    
            #print '================================================================='
            
    # 本次抓取的网址
    basicUrl='https://movie.douban.com/top250'
    k=0
    i=1
    
    
    print '===============================魔法开始==============================='
    
    while k<=225:
        html=getHTMLText(basicUrl,k)
        #time.sleep(2)
        k+=25
        getData(html)
        print '-------第'+str(i)+'轮完成!-------'
        i+=1
    
    print '完成!'
    复制代码
    复制代码

     已经能实现基本功能了

    随后,我们开始添加一些新功能,不过随着功能的增多,bug也随之而来:

    一开始,我们添加了将爬取结果写入到文件的功能,不过我们发现写入不全,后来发现漏了一句代码:

    # 关闭文件,否则容易写入不全    
    f.close()

    加上这句话后,程序就正常了,这次问题提示我们:python写入完文件,一定要关闭文件!

     在后来我们测试的时候,发现程序在cmd中运行会乱吗:

    参考了网上的资料,我们解决了问题

    在Windows环境CMD中显示乱码的解决方法

     将程序中都采用raw_input()的语句都改为:

    raw_input(unicode('xxxxxxxxxx','utf-8').encode('gbk'))

     程序就正常现实文本了

     在程序的各种功能实现后,我们想把程序连带运行库打包,因为程序是用python写的,一般人电脑里不会有这个运行环境,我们考虑了py2exe模块和pyinstaller模块,因为在网上找资料时,pyinstaller某些功能优于py2exe(最主要的是pyinstaller可以把程序的黑窗口隐藏)

    参考了网上的教程:

    Python | 用Pyinstaller打包发布exe应用

    成功打包后,变成了带有运行库的单文件 

     

  • 相关阅读:
    杭电acm1517
    杭电acm1228
    杭电acm1859
    杭电acm1124
    杭电acm1327
    CPP Templates 之 template 关键字的用法技巧
    malloc与calloc区别
    CPP Templates 之 类模板的继承
    CPP Templates 之 模板演绎的注意事项
    CPP Templates 之 局部类模板特化
  • 原文地址:https://www.cnblogs.com/ngy12138/p/7944306.html
Copyright © 2020-2023  润新知