003.[python学习] 简单抓取豆瓣网电影信息程序
声明:本程序仅用于学习爬网页数据,不可用于其它用途。
本程序仍有很多不足之处,请读者不吝赐教。
依赖:本程序依赖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学习] 简单抓取豆瓣网电影信息程序的更多相关文章
- Python3爬取豆瓣网电影信息
# -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前250的电影的名称 Language: Python3.6 ...
- Python学习 - 简单抓取页面
最近想做一个小web应用,就是把豆瓣读书和亚马逊等写有书评的网站上关于某本书的打分记录下来,这样自己买书的时候当作参考. 这篇日志这是以豆瓣网为例,只讨论简单的功能. 向服务器发送查询请求 这很好处理 ...
- 抓取豆瓣的电影排行榜TOP100
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称 ...
- requests爬取豆瓣top250电影信息
''' 1.爬取豆瓣top250电影信息 - 第一页: https://movie.douban.com/top250?start=0&filter= - 第二页: https://movie ...
- java网络爬虫----------简单抓取慕课网首页数据
© 版权声明:本文为博主原创文章,转载请注明出处 一.分析 1.目标:抓取慕课网首页推荐课程的名称和描述信息 2.分析:浏览器F12分析得到,推荐课程的名称都放在class="course- ...
- Python小爬虫——抓取豆瓣电影Top250数据
python抓取豆瓣电影Top250数据 1.豆瓣地址:https://movie.douban.com/top250?start=25&filter= 2.主要流程是抓取该网址下的Top25 ...
- Python 抓取网页并提取信息(程序详解)
最近因项目需要用到python处理网页,因此学习相关知识.下面程序使用python抓取网页并提取信息,具体内容如下: #---------------------------------------- ...
- Scrapy爬虫入门系列4抓取豆瓣Top250电影数据
豆瓣有些电影页面需要登录才能查看. 目录 [隐藏] 1 创建工程 2 定义Item 3 编写爬虫(Spider) 4 存储数据 5 配置文件 6 艺搜参考 创建工程 scrapy startproj ...
- 简易数据分析 04 | Web Scraper 初尝--抓取豆瓣高分电影
这是简易数据分析系列的第 4 篇文章. 今天我们开始数据抓取的第一课,完成我们的第一个爬虫.因为是刚刚开始,操作我会讲的非常详细,可能会有些啰嗦,希望各位不要嫌弃啊:) 有人之前可能学过一些爬虫知识, ...
随机推荐
- 零基础python入门(1)
1.前景及准备 (1).python是一门简单易学且功能强大的编程语言.它拥有高效的高级数据结构,并且能用简单而又高效的方式进行面向对象的编程.python优雅的语法和动态的类型,再结合它的解释性,使 ...
- java-递归练习
1.从键盘接收一个文件夹路径,统计该文件夹大小 public class Test1 { /** * @param args * 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小 * * 从键盘接 ...
- viewport定义,弹性布局,响应式布局及LESS和SASS框架应用
一,移动端宽度设置 viewport视图窗口,<meta name="viewport" content="width=device-width,initial-s ...
- 解题报告 『[NOI2003]逃学的小孩(树上操作)』
原题地址 今天翻看集训队巨佬写的一篇有关于树形动规的论文时看到了这道题,但感觉并不需要用动规,求出树的直径再暴力枚举一下就搞出来了. 其实是因为我太弱了,看不懂大佬在写什么orz 代码实现如下: #i ...
- Java Web 学习笔记 1
Java Web 学习笔记 1 一.Web开发基础 1-1 Java Web 应用开发概述 1.1.1 C/S C/S(Client/Server)服务器通常采用高性能的PC机或工作站,并采用大型数据 ...
- ssh_exchange_identification: read: Connection reset by peer
vim /etc/hosts.deny 删除ip 借鉴:https://www.sunnyos.com/article-show-81.html
- [Python]_ELVE_centos7安装Python3.7.1与Python2共存
注:该博客转载至PengYunjing博客,加以改动. #0x01 安装依赖环境 yum -y install zlib-devel bzip2-devel openssl-devel ncurses ...
- 发送ajax步骤
1.创建异步对象 一般命名为xhr var xhr = new XMLHttpRequest(); 2. 设置请求行 open(请求方式,请求url) 1.get 需要在url后 ...
- 使用DHCP动态管理主机地址
- Java技术学习之影响MySQL性能的配置参数
本文将介绍MySQL参数的五大类设置,平时我们一般都很少碰它们,在进行MySQL性能调优和故障诊断时这些参数还是非常有用的. (一)连接连接通常来自Web服务器,下面列出了一些与连接有关的参数,以及该 ...