通过bs4和requests获取豆瓣电影top250,并将内容写入到一个json文件中

#encoding=utf-8
import requests
import re
from bs4 import BeautifulSoup
from lxml import etree
import json


def load_page(url):
	r = requests.get(url)
	get_info(r.text)

def get_info(html):
	soup = BeautifulSoup(html, 'html.parser')
	movies = soup.find_all(attrs={'class': 'info'})
	item = {}
	for movie in movies:
		# print movie

		# 如果有中文名称和英文名称,分别获取并输出
		item['title'] = movie.div.a.find_all('span', {'class':'title'})[0].get_text()
		
		if len(movie.div.a.find_all('span', {'class':'title'})) >= 2:
			en_title = movie.div.a.find_all('span', {'class':'title'})[1].get_text()
			print 'english title:' + en_title[3:]

		# 获取电影的详细信息url地址
		item['url'] = movie.div.a['href']
		
		# 获取导演以及主创人员名单
		actor_dirctor = movie.find_all(attrs={'class':'bd'})[0].p.get_text()
		item['actor_dirctor'] = str(actor_dirctor).replace('/','').replace(' ', '').replace('\n', '')
		

		# 获取电影的评分信息
		item['rate'] = movie.find_all(attrs={'class': 'rating_num'})[0].get_text()

		# 获取电影的参与评价人数
		num = etree.HTML(str(movie))
		# item['num'] = num.xpath('//div[@class="star"]/span[4]/text()')[0]
		item['num'] = movie.find_all('span', content="10.0")[0].find_next('span').get_text()
		# item['num'] = movie.find('span', content="10.0").fin_next('span').get_text()
		print item['num']
		

		# 获取电影主旨信息
		item['message'] = movie.find_all(attrs={'class': 'inq'})[0].get_text()
		

		print "********************************************"

		save_info(item)
	

def save_info(item):
	with open('info.json', 'a') as f:
		date = json.dumps(dict(item), ensure_ascii=False)
		f.write(date + '\n')
		f.close()

if __name__ == '__main__':
	for page in xrange(0, 250, 25):
		print page
		url = 'https://movie.douban.com/top250?start=%s&filter=' %str(page)
		load_page(url)
		print '第{}-{}项内容写入完成'.format(page+1, page+25)

其中关于bs4中的一些查找内容的相关方法简单介绍如下:

#soup = BeautifulSoup('html代码')

##1.找到所有的具有相同属性的节点信息
soup.find_all(attrs={'key':'value'}) 返回列表形式的数据
实例:找到p标签中,class属性值为sister的标签  找到符合条件的所有标签
soup.find_all(attrs={'class':'sister'})
##2.找到指定节点下具有指定属性的 节
###2.1
soup.find_all('p', attrs={'key':'value'})  返回列表数据
实例:找到p标签中,class属性值为sister的标签   找到所有符合条件的p标签
soup.find_all('p', attrs={'class':'sister'})
###2.2
soup.find('span', content="10.0")   
找到符合条件的第一项的节点信息
同:
soup.find_all('span', content="10.0")[0]
找到符合条件的列表,取第一项节点信息

##3.获取某一个节点后之间的text文本值
在获取到节点之后,在标签信息后通过get_text()来获取文本信息
实例:找到p标签列表中第一项的文本值
soup.find_all('p', attrs={'class':'sister'})[0].get_text()

##4.获取某一个标签节点的后续兄弟节点
soup.find_all('span', content="10.0")[0].find_next('span').get_text()
找到一个节点信息,然后通过方法find_next('标签名称')找到,上一个节点后的第一个指定的标签,并获取其中的文本值

 

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