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" )