#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('标签名称')找到,上一个节点后的第一个指定的标签,并获取其中的文本值