博客第一天
测试页面:
★豆瓣高分电影榜★ (上)9.7-8.6分:https://www.douban.com/doulist/240962/,
目的:抓取该页面中每部电影的名称,图片链接,剧组信息,简介,评语
工程内容:Python3.5,jupyter notebook
工具包:urllib.request,BeautifulSoup
代码(单页内容):
from bs4 import BeautifulSoup as bs
import urllib.request as urlrequest
url = 'https://www.douban.com/doulist/240962/'
page = urlrequest.urlopen(url).read()
soup = bs(page,'lxml')
# #item1931154 > div > div.bd.doulist-subject > div.title > a
# #item1931153 > div > div.bd.doulist-subject > div.title > a
# #item1931152 > div > div.bd.doulist-subject > div.title > a
# #item1931131 > div > div.bd.doulist-subject > div.title > a, 此处为分析用的css selector内容,
a = 1931155 #第一部电影关键编号
info = [] #创建空的info数组存储爬取内容
for i in range(25): #每页有25部电影,设定i以便获取每部电影信息,i范围是0-24
titles = soup.select('#item{} > div > div.bd.doulist-subject > div.title > a'.format(a-i)) #名称
images = soup.select('#item{} > div > div.bd.doulist-subject > div.post > a > img'.format(a-i)) #图片
rates = soup.select('#item{} > div > div.bd.doulist-subject > div.rating > span.rating_nums'.format(a-i)) #评分
descs = soup.select('#item{} > div > div.bd.doulist-subject > div.abstract'.format(a-i)) #剧组信息
comments = soup.select('#item{} > div > div.ft > div.comment-item.content > blockquote'.format(a-i)) #评语
i = i - 1
# print(rates)
for title,image,rate,desc,comment in zip(titles,images,rates,descs,comments):
data = {
'title' : title.get_text(),
'image' : image.get('src'),
'rate' : rate.get_text(),
'desc' : list(desc.stripped_strings),
'comment' : comment.get_text()
}
info.append(data)
print(info) #检查输出是否正确
import pandas #导入pandas以便输出info到csv文件
df = pandas.DataFrame(info) #用DataFrame方法处理info
df.to_csv('douban_test2.csv') #输出到文件
print输出内容(部分):
csv截图(部分):
error内容:25部电影中有一部不能访问,只能获取部分信息,所以没有出现在print结果以及csv文件中
error相关:
总结:
1. print及csv各项的顺序于data中设定的顺序不一样,此处疑问待解决
2. 代码应该可以更简单
3. 可在此代码基础上改进:爬取整个榜单内容(经测试,榜单的编排规则在11页中部会发生变化,时间有限,未爬取全部榜单,仅获取229部)