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程式,能正常顯示結果