python爬虫,爬取豆瓣电影信息

不羁岁月 提交于 2019-11-30 13:33:26

hhhhh开心,搞了一整天,查了不少python基础资料,终于完成了第一个最简单的爬虫:爬取了豆瓣top250电影的名字、评分、评分人数以及短评。

代码实现如下:

#第一个最简单的爬虫
#爬取了豆瓣top250电影的名字、评分、评分人数以及短评

#观察豆瓣电影top250的网页可以发现:
#电影信息在一个ol标签之内,该标签的class属性值为grid_view
#1.电影的信息都在一个li标签里
#2.电影的电影名称在:第一个class属性值为hd的div标签下的 第一个 class属性值为title 的span标签里
#3.电影的评分在对应li标签里一个class属性值为rating_num 的span标签里
#4.电影的评价人数在 对应li标签 里的一个 class属性值为star 的div标签中 的最后一个数字
#5.电影的短评在 对应li标签 里的一个class属性值为inq的span标签里
#6.除第一页外,其他页的url:https://movie.douban.com/top250?start=X&filter= X的值为25-225的等差数列,差为25

from lxml import etree
import requests
import re

def get_info(url):
	movie_info = ''
	#通过get访问页面
	html = requests.get(url)
	selector = etree.HTML(html.text)
	content = selector.xpath('//ol[@class="grid_view"]/li')
	#第一个for循环抓取一整页的数据
	for r in content:
		#抓取电影的名字
		movie_name = r.xpath('./div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/span[@class="title"][1]/text()')[0]
		#抓取电影评分
		movie_score = r.xpath('./div[@class="item"]/div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0]
		#抓取电影评分人数
		people_num = r.xpath('./div[@class="item"]/div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[last()]/text()')[0]
		#抓取点评短评,这里使用try...except是因为遇到了几部电影没有短评!!!会报IndexError的错误,这样规避一下
		try:
			movie_quote = r.xpath('./div[@class="item"]/div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span[@class="inq"]/text()')[0]
		except IndexError:
			print('这部电影没有短评:', movie_name)
			movie_quote = ''
		finally:
			movie_info = movie_info + movie_name + '	' + movie_score + '		' + people_num + '	' + '短评:' + movie_quote + '\n'
			
	return movie_info

#这个函数用来把信息存储到文件
def save_info(movie_info):
	#'a+':文件指针将会放在文件的结尾,是追加模式。 
	#此处注意要使用utf-8,否则会报错:'gbk' codec can’t encode character –> 说明是将Unicode字符编码为GBK时候出现的问题;
	#往往最大的可能就是,本身Unicode类型的字符中,包含了一些无法转换为GBK编码的一些字符。
	with open('movie_info.txt', 'a+',encoding='utf-8') as f:
		f.write(movie_info)

if __name__ == "__main__":
	i = 25
	url_1 = 'https://movie.douban.com/top250'
	first_page_info = get_info(url_1)
	save_info(first_page_info)
	while True:
		if i > 225:
			break
		url_2 = 'https://movie.douban.com/top250?start={}&filter='.format(i)
		other_page_info = get_info(url_2)
		save_info(other_page_info)
		i = i + 25

说几点遇到的坑,具体都在代码注释的地方标明了:

1. 有些电影没有豆瓣短评!!代码中:

movie_quote = r.xpath('./div[@class="item"]/div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span[@class="inq"]/text()')[0]

这句会报出IndexError的错误,使用try...except做出规避

2.有些电影信息在进行编码时会报错:

UnicodeEncodeError: 'gbk' codec can't encode character '\u22ef' in position 775: illegal multibyte sequence

是将Unicode字符编码为GBK时候出现的问题:往往最大的可能就是,本身Unicode类型的字符中,包含了一些无法转换为GBK编码的一些字符。

在open文件时,加上编码格式解决:

open('movie_info.txt', 'a+',encoding='utf-8')


第一次爬虫还比较简陋,后续会加上多线程、post、尝试抓取图片、尝试使用scrapy。



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!