Python學(xué)習(xí)日記1| 用python爬取豆瓣電影top250

今天是3.17號(hào)。

離畢業(yè)論文開題只剩下不到15天,自己這邊還不知道要寫什么好,問了導(dǎo)師,導(dǎo)師給的范圍超級(jí)廣泛,實(shí)在是想吐槽。想了幾天,決定了要盡快給老師說自己的想法和方向,做什么還是靠自己比較靠譜。

身邊的同學(xué)這學(xué)期都開始去實(shí)習(xí)了,自己投了很多份簡(jiǎn)歷,大都石沉大海,唯一收到面試通知的廣發(fā)基金,結(jié)果因?yàn)楸憩F(xiàn)太差,缺乏深入思考gg了。看來術(shù)業(yè)有專攻,找到好工作還是要專的好。

最近投了幾篇小論文出去不過大都要到五一才會(huì)有結(jié)果,現(xiàn)在這一段時(shí)間想著學(xué)習(xí)點(diǎn)什么,以備為暑期開始找工作積攢點(diǎn)東西,或者僅僅是興趣而已。

打算在這里寫關(guān)于:
1.【python學(xué)習(xí)日記】
2.【求職日記】
3.【吉他學(xué)習(xí)日記】
4.【daily life】
這四類的文章吧,但愿能夠堅(jiān)持得久遠(yuǎn)一點(diǎn),因?yàn)樽约捍蠹s了解到自己是那種做某件事一開始熱情滿滿,一旦遇到困難不得化解就想放棄的人。

加油,alovera&薄荷蛋炒飯。


這里第一篇寫自己最近用python自動(dòng)爬取豆瓣電影top250的一些總結(jié)吧~
爬取過程中解決的問題:
1.分頁(yè)爬取時(shí)將url中的變量換為{},同時(shí)加上.format(str(i)) for i in range(0,51,25),這里表示從0開始依次取0、25、50,注意51是取不到的。

2.最開始用2.7版本,在使用字典存儲(chǔ)數(shù)據(jù)并寫入excel中時(shí)出現(xiàn)中文顯示為unicode,不能正常顯示,最后還是重新安裝上3.4版本才正常。但此時(shí)還出現(xiàn)的一個(gè)問題是中文雖然不是顯示為unicode了,但完全是亂碼,于是加上decode='gb2312'后才正常。

關(guān)于字符串編碼了解的知識(shí)如下,有待后面進(jìn)一步去實(shí)踐。
首先python中用到的字符串編碼有以下4種,但是我們要明白,字符串在網(wǎng)絡(luò)服務(wù)器或者磁盤中存儲(chǔ)的編碼是Unicode編碼,然后根據(jù)不同的需要與其它編碼進(jìn)行轉(zhuǎn)換。
(1)ASCII編碼
(2)Unicode編碼
(3)UTF-8編碼
(4)GBK編碼
將字符串進(jìn)行編碼和解碼分別使用,encode(),decode(),方法如下:

字符串在Python內(nèi)部的表示是unicode編碼,因此,在做編碼轉(zhuǎn)換時(shí),通常需要以u(píng)nicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再?gòu)膗nicode編碼(encode)成另一種編碼。 

>decode的作用是將其他編碼的字符串轉(zhuǎn)換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字符串str1轉(zhuǎn)換成unicode編碼。 
>encode的作用是將unicode編碼轉(zhuǎn)換成其他編碼的字符串,如str2.encode('gb2312'),表示將unicode編碼的字符串str2轉(zhuǎn)換成gb2312編碼。 
因此,轉(zhuǎn)碼的時(shí)候一定要先搞明白,字符串str是什么編碼,然后decode成unicode,然后再encode成其他編碼

代碼中字符串的默認(rèn)編碼與代碼文件本身的編碼一致。 
如:s='中文'
如果是在utf8的文件中,該字符串就是utf8編碼,如果是在gb2312的文件中,則其編碼為gb2312。這種情況下,
要進(jìn)行編碼轉(zhuǎn)換,都需要先用decode方法將其轉(zhuǎn)換成unicode編碼,再使用encode方法將其轉(zhuǎn)換成其他編碼。通常,在沒有指定特定的編碼方式時(shí),都是使用的系統(tǒng)默認(rèn)編碼創(chuàng)建的代碼文件。 

如果字符串是這樣定義:s=u'中文'
則該字符串的編碼就被指定為unicode了,即python的內(nèi)部編碼,而與代碼文件本身的編碼無關(guān)。因此,對(duì)于這種情況做編碼轉(zhuǎn)換,只需要直接使用encode方法將其轉(zhuǎn)換成指定編碼即可。
如果一個(gè)字符串已經(jīng)是unicode了,再進(jìn)行解碼則將出錯(cuò),因此通常要對(duì)其編碼方式是否為unicode進(jìn)行判斷:
    isinstance(s, unicode)  #用來判斷是否為unicode 
用非unicode編碼形式的str來encode會(huì)報(bào)錯(cuò) 

3.嗯每次就不寫太多文字了,一是懶得看,二是記住一些要點(diǎn)就好。最后貼上代碼和爬取的結(jié)果(截圖只截了一小部分)。


# -*- 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,
      '評(píng)分':rate,
      '評(píng)價(jià)數(shù)':evalu_num}        
frame=DataFrame(data,columns=[u'電影名',u'圖片鏈接',u'演員',u'印象',u'評(píng)分',u'評(píng)價(jià)數(shù)'])
print('done!!')

#將dataframe數(shù)據(jù)寫入csv或xlsx文件
frame.to_csv('C:\\\\Users\\\\guohuaiqi\\\\Desktop\\\\2.csv', decode='gb2312', index=True)

電影截圖.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 可以看我的博客 lmwen.top 或者訂閱我的公眾號(hào) 簡(jiǎn)介有稍微接觸python的人就會(huì)知道,python中...
    ayuLiao閱讀 3,400評(píng)論 1 5
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,827評(píng)論 1 118
  • 字符集和編碼簡(jiǎn)介 在編程中常??梢砸姷礁鞣N字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說...
    蘭山小亭閱讀 9,095評(píng)論 0 13
  • 個(gè)人筆記,方便自己查閱使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik閱讀 67,951評(píng)論 0 5
  • 說明:本文是我在readthedocs看到的,覺得很不錯(cuò)所以轉(zhuǎn)載過來,有刪改,原文地址點(diǎn)這里。 實(shí)用Unicode...
    aurora閱讀 1,056評(píng)論 0 6

友情鏈接更多精彩內(nèi)容