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”,

python爬虫(爬取豆瓣电影)_动态网页,json解释,中文编码_第1张图片

用过鼠标滚轮“滚”到下一页来触发js,从而得到

python爬虫(爬取豆瓣电影)_动态网页,json解释,中文编码_第2张图片

点击其中"有相同规律"的,找到其url,就是我们要爬取的网页

python爬虫(爬取豆瓣电影)_动态网页,json解释,中文编码_第3张图片


但是,后来发现这些url的内容其实是JSON:

python爬虫(爬取豆瓣电影)_动态网页,json解释,中文编码_第4张图片

问题又来了,什么是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程序,能正常显示结果

你可能感兴趣的:(Python爬虫)