声明:本程序仅用于学习爬网页数据,不可用于其它用途。

本程序仍有很多不足之处,请读者不吝赐教。

依赖:本程序依赖BeautifulSoup4和lxml,如需正确运行,请先安装。下面是代码:

 #!/usr/bin/env python
# -*- coding: utf-8 -*- import sys
reload(sys)
sys.setdefaultencoding('utf-8') #解决编码问题 """一个简单的从豆瓣网获取电影标签的示例,
1. 首先获取所有标签以及它所对应的请求连接,
获取所有标签的请求链接是https://movie.douban.com/tag/?view=cloud
2. 请求每个标签对应的链接获取该标签下所有电影信息
""" import urllib
import urllib2
import re
import codecs
# BeautifulSoup 用于解析html使用,本程序中使用lxml作为解析器
from bs4 import BeautifulSoup # url正则表达式,用于将url分割为多个部分,对其中某些部分进行url编码使用
URL_RGX = re.compile(r'(?P<prefix>https?://)(?P<mid>[^?]+)(?P<has_key>\??)(?P<parms>[^?]*)')
DOUBAN_TAG_URL = r'https://movie.douban.com/tag/?view=cloud' # url请求
def get_request(url):
# 对url特定部分进行编码
matches = URL_RGX.match(url)
if matches:
dic = matches.groupdict()
prefix = dic.get('prefix', '')
mid = urllib.quote(dic.get('mid', ''))
has_key = dic.get('has_key', '')
parms = dic.get('parms', '')
if parms != '':
tmp_dic = dict()
for kv in parms.split('&'):
k, v = kv, ''
if '=' in kv:
k, v = kv.split('=', 1)
tmp_dic[k] = v
parms = urllib.urlencode(tmp_dic)
url = '{0}{1}{2}{3}'.format(prefix, mid, has_key, parms)
else:
url = None
if url:
try:
res = urllib.urlopen(url)
if res and res.getcode() == 200:
return res.read()
except Exception as e:
pass
return '' # 获取所有标签信息,返回值为列表,列表中每个元素格式为(标签名, 标签url地址)
def get_all_tags():
all_tags = list()
page_text = get_request(DOUBAN_TAG_URL)
soup = BeautifulSoup(page_text, 'lxml')
tags = soup.find_all('a', attrs={'class': 'tag'})
for tag in tags:
tag_name = tag.string
# 将原有链接中的?focus=替换为空,替换后url为分页显示地址
tag_url = tag['href'].replace('?focus=', '')
all_tags.append((tag_name, tag_url))
return all_tags # 解析单个电影节点信息,返回电影信息字典
def parse_movie_tag(movie_tag):
# 下面15行代码好烂,下次改下它
movie_title_tag = movie_tag.find('a', attrs={'class': 'title'})
movie_title = '无名电影'
movie_detail_url = '无链接'
if movie_title_tag:
movie_title = movie_title_tag.string.strip()
movie_detail_url = movie_title_tag['href'].strip()
# movie_detail_url = movie_tag.find('a', attrs={'class': 'title'})['href']
movie_desc_tag = movie_tag.find('div', attrs={'class': 'desc'})
movie_desc = '无描述信息'
if movie_desc_tag:
movie_desc = movie_desc_tag.string.strip()
movie_rating_nums_tag = movie_tag.find('span', attrs={'class': 'rating_nums'})
movie_rating_nums = '无评分信息'
if movie_rating_nums_tag:
movie_rating_nums = movie_rating_nums_tag.string.strip()
return {'title': movie_title, 'detail_url': movie_detail_url,
'desc': movie_desc, 'rating_nums': movie_rating_nums} # 获取当前页面中的电影信息节点
def get_current_page_movies(page_url):
page_text = get_request(page_url)
soup = BeautifulSoup(page_text, 'lxml')
movies = soup.find_all('dd')
movie_info_lst = list()
for movie in movies:
# 将解析后的电影信息加入列表中
movie_info_lst.append(parse_movie_tag(movie))
return movie_info_lst if __name__ == '__main__':
# 获取所有标签信息
all_tags = get_all_tags()
# 标签信息存到文件中
all_tags_file = codecs.open('all_tags_info.txt', 'wb')
all_tags_file.write('标签名\t标签url地址\r\n')
for tag_name, tag_url in all_tags:
all_tags_file.write('{0}\t{1}\r\n'.format(tag_name, tag_url))
all_tags_file.flush()
all_tags_file.close() # 获取每个标签下的所有电影
for tag_name, tag_url in all_tags:
movie_infos_file = codecs.open(tag_name + '.txt', 'wb')
movie_infos_file.write('电影名\t标签名\t电影描述\t评分\t详细链接\r\n')
start = 0
while True:
target_url = '{base_url}?start={start}'.format(base_url=tag_url,
start=start)
movies = get_current_page_movies(target_url)
for movie in movies:
title = movie.get('title', '')
detail_url = movie.get('detail_url', '')
desc = movie.get('desc', '')
rating_nums = movie.get('rating_nums', '')
movie_infos_file.write('{0}\t{1}\t{2}\t{3}\t{4}\r\n'.format(title,
tag_name,
desc,
rating_nums,
detail_url))
movie_infos_file.flush()
# 计算当前页电影总个数,因单页只显示15条信息,
# 所以如果单页电影数小于15则表示无后续页面,则跳出循环不再请求此分类
current_page_movies_count = len(movies)
if current_page_movies_count < 15:
break
# 请求下一页标记数
start += current_page_movies_count
movie_infos_file.close()

运行结果截图:

图1-电影标签信息

图2-具体分类下电影信息

后续优化:1、获取电影详细信息;2、请求太频繁会被禁止访问

003.[python学习] 简单抓取豆瓣网电影信息程序的更多相关文章

  1. Python3爬取豆瓣网电影信息

      # -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前250的电影的名称 Language: Python3.6 ...

  2. Python学习 - 简单抓取页面

    最近想做一个小web应用,就是把豆瓣读书和亚马逊等写有书评的网站上关于某本书的打分记录下来,这样自己买书的时候当作参考. 这篇日志这是以豆瓣网为例,只讨论简单的功能. 向服务器发送查询请求 这很好处理 ...

  3. 抓取豆瓣的电影排行榜TOP100

    #!/usr/bin/env python # -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称 ...

  4. requests爬取豆瓣top250电影信息

    ''' 1.爬取豆瓣top250电影信息 - 第一页: https://movie.douban.com/top250?start=0&filter= - 第二页: https://movie ...

  5. java网络爬虫----------简单抓取慕课网首页数据

    © 版权声明:本文为博主原创文章,转载请注明出处 一.分析 1.目标:抓取慕课网首页推荐课程的名称和描述信息 2.分析:浏览器F12分析得到,推荐课程的名称都放在class="course- ...

  6. Python小爬虫——抓取豆瓣电影Top250数据

    python抓取豆瓣电影Top250数据 1.豆瓣地址:https://movie.douban.com/top250?start=25&filter= 2.主要流程是抓取该网址下的Top25 ...

  7. Python 抓取网页并提取信息(程序详解)

    最近因项目需要用到python处理网页,因此学习相关知识.下面程序使用python抓取网页并提取信息,具体内容如下: #---------------------------------------- ...

  8. Scrapy爬虫入门系列4抓取豆瓣Top250电影数据

    豆瓣有些电影页面需要登录才能查看. 目录 [隐藏]  1 创建工程 2 定义Item 3 编写爬虫(Spider) 4 存储数据 5 配置文件 6 艺搜参考 创建工程 scrapy startproj ...

  9. 简易数据分析 04 | Web Scraper 初尝--抓取豆瓣高分电影

    这是简易数据分析系列的第 4 篇文章. 今天我们开始数据抓取的第一课,完成我们的第一个爬虫.因为是刚刚开始,操作我会讲的非常详细,可能会有些啰嗦,希望各位不要嫌弃啊:) 有人之前可能学过一些爬虫知识, ...

随机推荐

  1. MySQL-02-进阶

    大纲 1)数据约束 2)数据库设计(表设计) 3)存储过程 4)触发器 5)mysql权限问题 数据约束 2.1什么数据约束 对用户操作表的数据进行约束 2.2 默认值 作用: 当用户对使用默认值的字 ...

  2. Mysql安装本地数据库

    1.下载解压:https://dev.mysql.com/downloads/mysql/ 2.配置环境变量path: D:\workPrograms\mysql-8.0.16-winx64\bin ...

  3. bzoj 4589 FWT

    #include<bits/stdc++.h> #define ll long long using namespace std; ; ; ; ; <<],b[<< ...

  4. node中间件概念

    中间件就是请求req和响应res之间的一个应用,请求浏览器向服务器发送一个请求后,服务器直接通过request定位属性的方式得到通过request携带过去的数据,就是用户输入的数据和浏览器本身的数据信 ...

  5. PHP之Trait详解

    php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性 用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Tra ...

  6. Django学习笔记之视图高级-错误处理

    错误处理 在一些网站开发中.经常会需要捕获一些错误,然后将这些错误返回比较优美的界面,或者是将这个错误的请求做一些日志保存.那么我们本节就来讲讲如何实现. 常见的错误码 404:服务器没有指定的url ...

  7. D# 语法

    这篇文章 随意 的 记录 关于 D# 语法的想法 . template 和 interface   同时作为一等公民 D# 是程序员的语言,不需要太多包装和修饰, D# 是 简单的, 编译器 和 ID ...

  8. 深入理解JavaScript事件循环机制

    前言 众所周知,JavaScript 是一门单线程语言,虽然在 html5 中提出了 Web-Worker ,但这并未改变 JavaScript 是单线程这一核心.可看HTML规范中的这段话: To ...

  9. [转]解决百度ueditor插入动态地图空白 支持iframe方法

    说明:新版本ueditor要修改 xss过滤白名单 修改配置文件ueditor.config.js 搜索:  whitList 增加下面第二行即可 ,whitList:{ iframe: ['fram ...

  10. 2019年3月更新 技术分享 WPF基本界面制作

    1.制作流程1.在vs中建立一个wpf程序2.建立一个主页面(.cs)(注:C#程序每一个页面都由两个文件构成一个xaml一个cs,一个前端文件一个后台文件)3.在主页面中添加按钮,按钮中嵌入图片,这 ...