使用Beautiful Soup和requests爬取豆瓣电影top250
1. Beautiful Soup前面介绍了Beautiful Soup的基本使用方法,请参考文章 爬虫利器BeautifulSoup之CSS选择器的基本使用和Beautiful Soup之find()和find_all()的基本使用,现在搞个实例来验证一下。就以爬取豆瓣电影信息为例吧。2. 分析请求链接打开豆瓣电影top250首页信息如下:下滑到最下方,可以看到一共有10页,F12或右键检查每页
·
1. Beautiful Soup
前面介绍了Beautiful Soup的基本使用方法,请参考文章 爬虫利器BeautifulSoup之CSS选择器的基本使用和Beautiful Soup之find()和find_all()的基本使用,现在搞个实例来验证一下。就以爬取豆瓣电影信息为例吧。
2. 分析请求链接
打开豆瓣电影top250首页信息如下:
下滑到最下方,可以看到一共有10页,F12或右键检查每页的具体链接,可以发现如下规律:
#第1页:
https://movie.douban.com/top250?start=0&filter=
#第2页:
https://movie.douban.com/top250?start=25&filter=
#第3页:
https://movie.douban.com/top250?start=50&filter=
#第4页:
https://movie.douban.com/top250?start=75&filter=
......
#第10页:
https://movie.douban.com/top250?start=225&filter=
不难发现每一页的链接不同之处在于start参数值不一样。随着页数的增加,start每次增加25,一直到最后一页为225,故可以轻松的构造前十页的链接。
base_url = 'https://movie.douban.com/top250?start={}&filter='
url_list = [base_url.format(i) for i in range(0, 250, 25)]
3.使用requests获取每个链接的网页源码
只需伪装一下请求头即可,代码如下:
def get_html(url):
header = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}
return requests.get(url=url, headers=header).text
4. 使用Beautiful Soup解析网页
使用Beautiful Soup提取电影信息,提取的信息包括:电影图片链接src、电影详情页链接href、电影标题title、导演和主演信息以及上映年份等direct、电影评分score、电影评论人数comment_num、电影概述quote等。
def parser_html(response):
soup = BeautifulSoup(response, 'html.parser')
# 获取包含25个电影信息的li标签
li_list = soup.select('ol.grid_view li')
info = []
# 解析每一个li标签中的电影信息
for li in li_list:
src = li.select('img')[0].get('src')
href = li.select('a[href]')[0].get('href')
title = li.select('span')[0].string
direct = li.select('div.bd p')[0].get_text().replace('\n', '').replace(' ', '')
score = li.select('span.rating_num')[0].string
comment_num = li.select('div.star span')[3].string
# 因为后面几部电影没有概述quote,会发生数组越界,这里捕获一下。
try:
quote = li.select('span.inq')[0].string
except IndexError:
quote = None
print(src, href, title, direct, score, comment_num, quote)
info.append({'src': src, 'href': href, 'title': title, 'direct': direct, 'score': score, 'comment_num': comment_num, 'quote': quote})
# 每一页的25个电影信息都在info变量中了。
return info
5.把信息保存至mongodb数据库
使用mongo数据库保存电影信息,这里把信息保存到Douban数据库,集合名称为douban.
def save_info_to_mongo(info):
client = pymongo.MongoClient('localhost', 27017)
collection = Collection(Database(client, 'Douban'), 'douban')
for info in info:
collection.insert_one(info)
client.close()
6.全部代码如下
没有安装mongo数据库的可以不使用save_info_to_mongo函数,或者自己使用其他数据库保存一下也可以!
import pymongo
import requests
from bs4 import BeautifulSoup
from pymongo.database import Database
from pymongo.collection import Collection
def get_html(url):
header = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}
return requests.get(url=url, headers=header).text
def parser_html(response):
soup = BeautifulSoup(response, 'html.parser')
li_list = soup.select('ol.grid_view li')
info = []
for li in li_list:
src = li.select('img')[0].get('src')
href = li.select('a[href]')[0].get('href')
title = li.select('span')[0].string
direct = li.select('div.bd p')[0].get_text().replace('\n', '').replace(' ', '')
score = li.select('span.rating_num')[0].string
comment_num = li.select('div.star span')[3].string
try:
quote = li.select('span.inq')[0].string
except IndexError:
quote = None
print(src, href, title, direct, score, comment_num, quote)
info.append({'src': src, 'href': href, 'title': title, 'direct': direct, 'score': score, 'comment_num': comment_num, 'quote': quote})
return info
def save_info_to_mongo(info):
client = pymongo.MongoClient('localhost', 27017)
collection = Collection(Database(client, 'Douban'), 'douban')
for info in info:
collection.insert_one(info)
client.close()
if __name__ == '__main__':
base_url = 'https://movie.douban.com/top250?start={}&filter='
url_list = [base_url.format(i) for i in range(0, 250, 25)]
for page_url in url_list:
info = parser_html(get_html(page_url))
# 没有mongo数据库就把这一行注释一下
save_info_to_mongo(info)
7.成果展示
更多推荐
已为社区贡献1条内容
所有评论(0)