1. 程式人生 > >python爬蟲(爬取豆瓣電影)_動態網頁,json解釋,中文編碼

python爬蟲(爬取豆瓣電影)_動態網頁,json解釋,中文編碼

from bs4 import BeautifulSoup
import requests
import json
import sys
import codecs

reload(sys)
sys.setdefaultencoding( "utf-8" )

rank = 0

every_film = ''

for start in range(0,80,20):

    url = 'https://movie.douban.com/j/chart/top_list?type=25&interval_id=100%3A90&action=&start='+str(start)+'&limit=20'

    source_code = requests.get(url)
    soup = BeautifulSoup(source_code.text,'lxml')

    j = json.loads(soup.text) #explain json

    for film in j:  #every 'film' is a dict
        #print film
        rank = rank + 1 #rank
        every_film = every_film + str(rank) + ' : Name:' +str(film[u'title']).decode('utf-8') #add film's name
        every_film = every_film + ' Rating:' + str(film[u'rating'][0]).decode('utf-8') #add rating
        every_film = every_film + ' Date:' + str(film[u'release_date']).decode('utf-8') #add date
        every_film = every_film + ' Url:' + str(film[u'url']).decode('utf-8') + '\r\n' #add url

print every_film

folder_path = 'D:/spider_things/2016.4.18/douban_films.txt'

with codecs.open(folder_path,'wb','gbk') as f:
    f.write(every_film)

print 'DONE!'


經過了幾天的折(tou)騰(lan),今天終於是初步學會了爬取動態網站了,於是就去爬取了豆瓣電影的動畫排行版(https://movie.douban.com/typerank?type_name=%E5%8A%A8%E7%94%BB&type=25&interval_id=100:90&action=)。

知識點:

1.動態網站

所謂動態網站,通俗來說就是一些不用按“下一頁”、自動會載入下一頁內容的網站。(這些網站通常經過了特殊的 js 處理,並且爬到的東西是JSON內容)

在爬取動態網站是,想要正確找到我們所需要的爬取的網頁我們一般需要一下步驟:

在瀏覽器中按f12後,檢視"Network"欄中的“XHR”,


用過滑鼠滾輪“滾”到下一頁來觸發js,從而得到


點選其中"有相同規律"的,找到其url,就是我們要爬取的網頁


但是,後來發現這些url的內容其實是JSON:


問題又來了,什麼是JSON ?如何把JSON轉化為可利用的文字內容?

2.JSON

JSON  是一種一種輕量級的資料交換格式。具體常用操作有:

import json
j = json.loads(xxx.text) #把json內容還原回原來物件

注意:

1..loads方法    中的括號中,要用.text方法  把 xxx 轉化為 純文字 才能正常使用

(如本次程式中,我把用beautifulsoup得到的soup用text方法轉化後,在用json.loads來轉化成列表

source_code = requests.get(url)
soup = BeautifulSoup(source_code.text,'lxml')
j = json.loads(soup.text) #explain json

2.用.loads轉化出來的內容是一個列表(list)

其他關於json的更詳細的內容看:點選開啟連結點選開啟連結

3. 把列表(list)或字典(dict)的內容轉化成字串

一般用for迴圈遍歷列表(字典)

然後用str(xxx).decode('utf-8')

4.解決了一箇中文編碼的問題

就是解決“把一個列表轉換成字串輸出的時候出現了UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-34: ordinal not in range(128)”問題:

方法1:
在開頭加上

import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

方法2:
使用cmd執行python程式,能正常顯示結果