美文网首页python生活不易 我用python
Python学习日记1| 用python爬取豆瓣电影top250

Python学习日记1| 用python爬取豆瓣电影top250

作者: 是蓝先生 | 来源:发表于2016-03-17 10:38 被阅读1226次

    今天是3.17号。

    离毕业论文开题只剩下不到15天,自己这边还不知道要写什么好,问了导师,导师给的范围超级广泛,实在是想吐槽。想了几天,决定了要尽快给老师说自己的想法和方向,做什么还是靠自己比较靠谱。

    身边的同学这学期都开始去实习了,自己投了很多份简历,大都石沉大海,唯一收到面试通知的广发基金,结果因为表现太差,缺乏深入思考gg了。看来术业有专攻,找到好工作还是要专的好。

    最近投了几篇小论文出去不过大都要到五一才会有结果,现在这一段时间想着学习点什么,以备为暑期开始找工作积攒点东西,或者仅仅是兴趣而已。

    打算在这里写关于:
    1.【python学习日记】
    2.【求职日记】
    3.【吉他学习日记】
    4.【daily life】
    这四类的文章吧,但愿能够坚持得久远一点,因为自己大约了解到自己是那种做某件事一开始热情满满,一旦遇到困难不得化解就想放弃的人。

    加油,alovera&薄荷蛋炒饭。


    这里第一篇写自己最近用python自动爬取豆瓣电影top250的一些总结吧~
    爬取过程中解决的问题:
    1.分页爬取时将url中的变量换为{},同时加上.format(str(i)) for i in range(0,51,25),这里表示从0开始依次取0、25、50,注意51是取不到的。

    2.最开始用2.7版本,在使用字典存储数据并写入excel中时出现中文显示为unicode,不能正常显示,最后还是重新安装上3.4版本才正常。但此时还出现的一个问题是中文虽然不是显示为unicode了,但完全是乱码,于是加上decode='gb2312'后才正常。

    关于字符串编码了解的知识如下,有待后面进一步去实践。
    首先python中用到的字符串编码有以下4种,但是我们要明白,字符串在网络服务器或者磁盘中存储的编码是Unicode编码,然后根据不同的需要与其它编码进行转换。
    (1)ASCII编码
    (2)Unicode编码
    (3)UTF-8编码
    (4)GBK编码
    将字符串进行编码和解码分别使用,encode(),decode(),方法如下:

    字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 
    
    >decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。 
    >encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。 
    因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码
    
    代码中字符串的默认编码与代码文件本身的编码一致。 
    如:s='中文'
    如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,
    要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。 
    
    如果字符串是这样定义:s=u'中文'
    则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
    如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:
        isinstance(s, unicode)  #用来判断是否为unicode 
    用非unicode编码形式的str来encode会报错 
    

    3.嗯每次就不写太多文字了,一是懒得看,二是记住一些要点就好。最后贴上代码和爬取的结果(截图只截了一小部分)。


    # -*- coding: utf-8 -*-
    """
    Created on Fri Mar 04 10:48:10 2016
    @author: guohuaiqi
    """
    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    from bs4 import BeautifulSoup
    import requests
    import time
    
    urls=['https://movie.douban.com/top250?start={}&filter='.format(str(i)) for i in range(0,50,25)]
    #url='https://movie.douban.com/mine?status=wish'
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36',
        'Cookie':'bid="+RZMojI+I84"; ll="118281"; viewed="7056708_10863574_26647176_3288908"; gr_user_id=7758d24b-1ff7-4bfb-aac5-da0cebb3b129; _ga=GA1.2.1164329915.1430920272; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1457141967%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DwlFfuGH8nDDaDfhuElvs2e-927672lPlTf3UP5ra2LVTDrCK1YcFpyYiIAPJcOqq%26wd%3D%26eqid%3D86da232a00235c820000000356da38c0%22%5D; ps=y; ue="alovera@sina.com"; dbcl2="61719891:SKQE4SmJJ7U"; ck="WzE9"; ap=1; push_noty_num=0; push_doumail_num=0; __utma=30149280.1164329915.1430920272.1457093782.1457141968.44; __utmb=30149280.6.10.1457141968; __utmc=30149280; __utmz=30149280.1457141968.44.23.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmv=30149280.6171; __utma=223695111.1164329915.1430920272.1457093782.1457141968.6; __utmb=223695111.0.10.1457141968; __utmc=223695111; __utmz=223695111.1457141968.6.5.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; _pk_id.100001.4cf6=051573cd37c5bc0e.1446452093.6.1457142204.1457093853.; _pk_ses.100001.4cf6=*'
    }
    
    title=[]
    image=[]
    actor=[]
    empression=[]
    rate=[]
    evalu_num=[]
    #爬取并显示top250电影的名称,图片地址,演员等
    def allfilm(web_url,data=None):    
        web_data=requests.get(web_url)
        soup=BeautifulSoup(web_data.text,'lxml')
        time.sleep(2)
        titles=soup.select('#content > div > div.article > ol > li > div > div.info > div.hd > a')
        images=soup.select('#content > div > div.article > ol > li > div > div.pic > a > img')
        actors=soup.select('#content > div > div.article > ol > li > div > div.info > div.bd > p:nth-of-type(1)')
        empressions=soup.select('#content > div > div.article > ol > li > div > div.info > div.bd > p:nth-of-type(2)')
        rates=soup.select('#content > div > div.article > ol > li > div > div.info > div.bd > div > span.rating_num')
        evalu_nums=soup.select('#content > div > div.article > ol > li > div > div.info > div.bd > div > span:nth-of-type(4)')
    
        for title1,image1,actor1,empression1,rate1,evalu_num1 in zip(titles,images,actors,empressions,rates,evalu_nums):
            title.append(title1.get_text().replace('\\xa0',' ').strip()),
            image.append(image1.get('src')),
            actor.append(actor1.get_text().replace('\\xa0',' ').strip()),
            empression.append(empression1.get_text()),
            rate.append(rate1.get_text()),
            evalu_num.append(evalu_num1.get_text())
    
    for sigle_url in urls:
        allfilm(sigle_url)
    data={'电影名':title,
          '图片链接':image,
          '演员':actor,
          '印象':empression,
          '评分':rate,
          '评价数':evalu_num}        
    frame=DataFrame(data,columns=[u'电影名',u'图片链接',u'演员',u'印象',u'评分',u'评价数'])
    print('done!!')
    
    #将dataframe数据写入csv或xlsx文件
    frame.to_csv('C:\\\\Users\\\\guohuaiqi\\\\Desktop\\\\2.csv', decode='gb2312', index=True)
    

    电影截图.png

    相关文章

      网友评论

      • 波西米亚的游鱼:以后是不是想看什么电影就可以直接找你了?😁😁加油,我也要在准备教师招聘考试了
        是蓝先生:@仰望星空de小孩 网易云课堂上有很多,你搜一下
        程序员LesterXu:楼主学习的python的资源在哪里找到的?
        是蓝先生:@波西米亚的游鱼 哈哈不是不是,爬取的只是top 250电影的相关信息,没有下载下来~教师招聘考试?意思是要去哪个学校教书吗

      本文标题:Python学习日记1| 用python爬取豆瓣电影top250

      本文链接:https://www.haomeiwen.com/subject/izcclttx.html