今天是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)
