Python爬虫实战——豆瓣电影top250


很多天没有发博客了,这几天在弄一个文本相似度的项目,问题一个接一个,忙活了好几天。

今天分享一下之前的写的爬虫,用来爬豆瓣电影的top250。

首先,F12看看电影的信息在哪里


每个电影的信息都在这个class="item"的块中,好的,这下好办了,找到这个块,就可以一个个把里面的东西抓出来了。

这里面最麻烦的还是处理信息缺失的问题,有的电影没有一句话评论,如果用了list来索引,会抛list indexerror ,最好用next_sibiling

好了,源码在这里,注释都写的很详细了。

#!/usr/bin/python
# -*- encoding:utf-8 -*-

"""
@author : kelvin
@file : douban_movie
@time : 2017/2/22 23:04
@description :

"""
import sys
import requests
import re
from bs4 import BeautifulSoup
import csv

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

# 先创建一个csv文件,写好头部
with open("douban_top250_movies.csv", 'w') as filed: # a+为添加,w为擦除重写
csv_writer = csv.DictWriter(filed, [
u'片名',
u'评分',
u'评分人数',
u'一句话描述',
u'豆瓣链接',
])
csv_writer.writeheader()


def get_mov_info(response):
mov_info = {}
soup = BeautifulSoup(response.text, "lxml")
movies = soup.find_all('div', class_="info")

for info in movies: # 从包含电影信息的块来寻找
# 获得电影的中文名
mov_info['mov_name'] = info.find('span', class_='title').text # find()只找到一个,结果以树结构返回

# 获得电影在豆瓣中的链接
mov_info['mov_link'] = info.find('a').get('href')

# 找到评分以及评价人数
rating_num = info.find(class_='rating_num')
mov_info['rating_score'] = rating_num.text
comment = rating_num.find_next_sibling().find_next_sibling()
# 对评价字段切分
comment_num = re.findall('\d{0,}', comment.text)
mov_info['comment_nums'] = comment_num[0] # 正则匹配re中没有find(),findall()以列表形式返回结果

# 获得一句话评价
comment_one = info.find('span', class_='inq')
if comment_one is None: # 处理没有一句话评价的情况
mov_info['inq_comment'] = u' '
else:
mov_info['inq_comment'] = comment_one.text
print mov_info

# 一条条存入csv文件
write_csv(mov_info)


def write_csv(info_dict):
with open("douban_top250_movies.csv", 'a+') as f:
csv_write = csv.DictWriter(f, [
u'片名',
u'评分',
u'评分人数',
u'一句话描述',
u'豆瓣链接',
])
csv_write.writerow({ # writerow()写入单行,writerows写入多行,这里只有一行数据,用writerows报错
u'片名': info_dict['mov_name'],
u'评分': info_dict['rating_score'],
u'评分人数': info_dict['comment_nums'],
u'一句话描述': info_dict['inq_comment'],
u'豆瓣链接': info_dict['mov_link']
})

for num in xrange(0, 10): # 遍历所有页数
page = num * 25
response = requests.get("https://movie.douban.com/top250?start=%d&filter=" % page)
print response
get_mov_info(response)
爬下来这些信息可以干嘛?哈哈哈,当然是一个个去看完它!



智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告