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

今天是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="[email protected]"; 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)

Python学习日记1| 用python爬取豆瓣电影top250_第1张图片
电影截图.png

你可能感兴趣的:(Python学习日记1| 用python爬取豆瓣电影top250)