003.[python学习] 简单抓取豆瓣网电影信息程序

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

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

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

  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3
  4
  5 import sys
  6 reload(sys)
  7 sys.setdefaultencoding(‘utf-8‘)  #解决编码问题
  8
  9
 10 """一个简单的从豆瓣网获取电影标签的示例,
 11 1. 首先获取所有标签以及它所对应的请求连接,
 12    获取所有标签的请求链接是https://movie.douban.com/tag/?view=cloud
 13 2. 请求每个标签对应的链接获取该标签下所有电影信息
 14 """
 15
 16
 17 import urllib
 18 import urllib2
 19 import re
 20 import codecs
 21 # BeautifulSoup 用于解析html使用,本程序中使用lxml作为解析器
 22 from bs4 import BeautifulSoup
 23
 24
 25 # url正则表达式,用于将url分割为多个部分,对其中某些部分进行url编码使用
 26 URL_RGX = re.compile(r‘(?P<prefix>https?://)(?P<mid>[^?]+)(?P<has_key>\??)(?P<parms>[^?]*)‘)
 27 DOUBAN_TAG_URL = r‘https://movie.douban.com/tag/?view=cloud‘
 28
 29
 30 # url请求
 31 def get_request(url):
 32     # 对url特定部分进行编码
 33     matches = URL_RGX.match(url)
 34     if matches:
 35         dic = matches.groupdict()
 36         prefix = dic.get(‘prefix‘, ‘‘)
 37         mid = urllib.quote(dic.get(‘mid‘, ‘‘))
 38         has_key = dic.get(‘has_key‘, ‘‘)
 39         parms = dic.get(‘parms‘, ‘‘)
 40         if parms != ‘‘:
 41             tmp_dic = dict()
 42             for kv in parms.split(‘&‘):
 43                 k, v = kv, ‘‘
 44                 if ‘=‘ in kv:
 45                     k, v = kv.split(‘=‘, 1)
 46                 tmp_dic[k] = v
 47             parms = urllib.urlencode(tmp_dic)
 48         url = ‘{0}{1}{2}{3}‘.format(prefix, mid, has_key, parms)
 49     else:
 50         url = None
 51     if url:
 52         try:
 53             res = urllib.urlopen(url)
 54             if res and res.getcode() == 200:
 55                 return res.read()
 56         except Exception as e:
 57             pass
 58     return ‘‘
 59
 60
 61 # 获取所有标签信息,返回值为列表,列表中每个元素格式为(标签名, 标签url地址)
 62 def get_all_tags():
 63     all_tags = list()
 64     page_text = get_request(DOUBAN_TAG_URL)
 65     soup = BeautifulSoup(page_text, ‘lxml‘)
 66     tags = soup.find_all(‘a‘, attrs={‘class‘: ‘tag‘})
 67     for tag in tags:
 68         tag_name = tag.string
 69         # 将原有链接中的?focus=替换为空,替换后url为分页显示地址
 70         tag_url = tag[‘href‘].replace(‘?focus=‘, ‘‘)
 71         all_tags.append((tag_name, tag_url))
 72     return all_tags
 73
 74
 75 # 解析单个电影节点信息,返回电影信息字典
 76 def parse_movie_tag(movie_tag):
 77     # 下面15行代码好烂,下次改下它
 78     movie_title_tag = movie_tag.find(‘a‘, attrs={‘class‘: ‘title‘})
 79     movie_title = ‘无名电影‘
 80     movie_detail_url = ‘无链接‘
 81     if movie_title_tag:
 82         movie_title = movie_title_tag.string.strip()
 83         movie_detail_url = movie_title_tag[‘href‘].strip()
 84     # movie_detail_url = movie_tag.find(‘a‘, attrs={‘class‘: ‘title‘})[‘href‘]
 85     movie_desc_tag = movie_tag.find(‘div‘, attrs={‘class‘: ‘desc‘})
 86     movie_desc = ‘无描述信息‘
 87     if movie_desc_tag:
 88         movie_desc = movie_desc_tag.string.strip()
 89     movie_rating_nums_tag = movie_tag.find(‘span‘, attrs={‘class‘: ‘rating_nums‘})
 90     movie_rating_nums = ‘无评分信息‘
 91     if movie_rating_nums_tag:
 92         movie_rating_nums = movie_rating_nums_tag.string.strip()
 93     return {‘title‘: movie_title, ‘detail_url‘: movie_detail_url,
 94             ‘desc‘: movie_desc, ‘rating_nums‘: movie_rating_nums}
 95
 96
 97 # 获取当前页面中的电影信息节点
 98 def get_current_page_movies(page_url):
 99     page_text = get_request(page_url)
100     soup = BeautifulSoup(page_text, ‘lxml‘)
101     movies = soup.find_all(‘dd‘)
102     movie_info_lst = list()
103     for movie in movies:
104         # 将解析后的电影信息加入列表中
105         movie_info_lst.append(parse_movie_tag(movie))
106     return movie_info_lst
107
108
109 if __name__ == ‘__main__‘:
110     # 获取所有标签信息
111     all_tags = get_all_tags()
112     # 标签信息存到文件中
113     all_tags_file = codecs.open(‘all_tags_info.txt‘, ‘wb‘)
114     all_tags_file.write(‘标签名\t标签url地址\r\n‘)
115     for tag_name, tag_url in all_tags:
116         all_tags_file.write(‘{0}\t{1}\r\n‘.format(tag_name, tag_url))
117         all_tags_file.flush()
118     all_tags_file.close()
119
120     # 获取每个标签下的所有电影
121     for tag_name, tag_url in all_tags:
122         movie_infos_file = codecs.open(tag_name + ‘.txt‘, ‘wb‘)
123         movie_infos_file.write(‘电影名\t标签名\t电影描述\t评分\t详细链接\r\n‘)
124         start = 0
125         while True:
126             target_url = ‘{base_url}?start={start}‘.format(base_url=tag_url,
127                                                            start=start)
128             movies = get_current_page_movies(target_url)
129             for movie in movies:
130                 title = movie.get(‘title‘, ‘‘)
131                 detail_url = movie.get(‘detail_url‘, ‘‘)
132                 desc = movie.get(‘desc‘, ‘‘)
133                 rating_nums = movie.get(‘rating_nums‘, ‘‘)
134                 movie_infos_file.write(‘{0}\t{1}\t{2}\t{3}\t{4}\r\n‘.format(title,
135                                                                           tag_name,
136                                                                           desc,
137                                                                           rating_nums,
138                                                                           detail_url))
139                 movie_infos_file.flush()
140             # 计算当前页电影总个数,因单页只显示15条信息,
141             # 所以如果单页电影数小于15则表示无后续页面,则跳出循环不再请求此分类
142             current_page_movies_count = len(movies)
143             if current_page_movies_count < 15:
144                 break
145             # 请求下一页标记数
146             start += current_page_movies_count
147         movie_infos_file.close()

运行结果截图:

图1-电影标签信息

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

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

时间: 2024-11-06 15:03:51

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

python学习之抓取猫眼电影Top100榜单

目录 1 本篇目标 2 url分析 3 页面抓取 4 页面分析 5 代码整合 6 优化 参考: 近期开始学习python爬虫,熟悉了基本库.解析库之后,决定做个小Demo来实践下,检验学习成果. 1 本篇目标 抓取猫眼电影总排行榜Top100电影单 根据电影演员表统计演员上榜次数 2 url分析 目标站点为https://maoyan.com/board/4,打开之后就可以看到排行榜信息,如图所示 页面上显示10部电影,有名次.影片名称.演员信息等信息.当拉到最下面点击第二页的时候,发现url变

python学习笔记-抓取网页图片脚本

初学者一枚,代码都是模仿网上的.亲测可用~ 运行脚本的前提是本机安装了httplib2模块 #!/usr/bin/python import os import re import string import urllib #author:reed #date:2014-05-14 def GetWebPictures(): url=raw_input('please input the website you want to download:') imgcontent=urllib.urlo

[python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对比,你可以进一步加深Python爬虫的印象.同时,文章给出了我以前关于爬虫的基础知识介绍,方便新手进行学习.        总之,希望文章对你有所帮助,如果存在不错或者错误的地方,还请海涵~ 一. DOM树结构分析 豆瓣Top250电影网址:https://movie.douban.com/top2

抓取豆瓣的电影排行榜TOP100

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称 5 Anthor: Andrew Liu 6 Version: 0.0.1 7 Date: 2014-12-04 8 Language: Python2.7.8 9 Editor: Sublime Text2 10 Operate: 具体操作请看README.md介绍 11 "&q

Python爬虫项目--爬取自如网房源信息

本次爬取自如网房源信息所用到的知识点: 1. requests get请求 2. lxml解析html 3. Xpath 4. MongoDB存储 正文 1.分析目标站点 1. url: http://hz.ziroom.com/z/nl/z3.html?p=2 的p参数控制分页 2. get请求 2.获取单页源码 1 # -*- coding: utf-8 -*- 2 import requests 3 import time 4 from requests.exceptions import

Python 爬虫学习3 -简单抓取小说网信息

小说网 https://www.qu.la/paihangbang/ 功能:抓取每个排行榜内的小说名和对应链接,然后写入excel表格里面. 按F12 审查页面元素可以得到你所要的信息的class,从而来定位. 具体看代码讲解吧. #coding:utf-8 #为了正常转码 必写 import codecs #为下面新建excel,转码正确准备得一个包 __author__ = 'Administrator' import requests from bs4 import BeautifulSo

Python爬虫之抓取豆瓣影评数据

脚本功能: 1.访问豆瓣最受欢迎影评页面(http://movie.douban.com/review/best/?start=0),抓取所有影评数据中的标题.作者.影片以及影评信息 2.将抓取的信息写入excel中 页面信息如下: 一共5页,需要循环访问不同的页面 HTML源代码: <a class="" title="<权力的游戏>S5E8:凛冬已至,凡人皆死" href="http://movie.douban.com/review

[python学习] 简单爬取维基百科程序语言消息盒

文章主要讲述如何通过Python爬取维基百科的消息盒(Infobox),主要是通过正则表达式和urllib实现:后面的文章可能会讲述通过BeautifulSoup实现爬取网页知识.由于这方面的文章还是较少,希望提供一些思想和方法对大家有所帮助.如果有错误或不足之处,欢迎之处:如果你只想知道该篇文章最终代码,建议直接阅读第5部分及运行截图. 一. 维基百科和Infobox 你可能会疑惑Infobox究竟是个什么东西呢?下面简单介绍. 维基百科作为目前规模最大和增长最快的开放式的在线百科系统,其典型

Python分布式爬虫抓取知乎用户信息并进行数据分析

在以前的文章中,我写过一篇使用selenium来模拟登录知乎的文章,然后在很长一段时间里都没有然后了... 不过在最近,我突然觉得,既然已经模拟登录到了知乎了,为什么不继续玩玩呢?所以就创了一个项目,用来采集知乎的用户公开信息,打算用这些数据试着分析一下月入上万遍地走.清华北大不如狗的贵乎用户像不像我们想象中的那么高质量. 第一步:首先是爬虫抓取用户信息,能用图解释的绝不多废话: 但是还是得主要说下: 首先:个人感觉,在写一些小的demo时用框架就反而更显得繁琐,所以我没有使用框架,而是自己使用