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、请求太频繁会被禁止访问
转载于:https://www.cnblogs.com/amtoor/p/5568863.html
003.[python学习] 简单抓取豆瓣网电影信息程序相关推荐
- python爬取豆瓣电影信息_Python|简单爬取豆瓣网电影信息
前言: 在掌握一些基础的爬虫知识后,就可以尝试做一些简单的爬虫来练一练手.今天要做的是利用xpath库来进行简单的数据的爬取.我们爬取的目标是电影的名字.导演和演员的信息.评分和url地址. 准备环境 ...
- Python|简单爬取豆瓣网电影信息
欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 欢迎加入团队圈子!与作者面对面!直接点击! 前言: 在掌握一些 ...
- 如何抓取豆瓣网电影海报信息及重命名
打开豆瓣电影url:https://movie.douban.com/ 找到真正存储信息的url:https://movie.douban.com/j/search_subjects?type=mov ...
- python爬虫:批量抓取代理ip,进行验证,抓取豆瓣网站影视信息
本文作为学习笔记参考用: [1]批量抓取代理ip: 找到第三方ip代理的网站,进行分析,并批量抓取,抓取程序放到Proxies_spider.py中,如下所示: import re import re ...
- 数据分析与挖掘案例之使用python抓取豆瓣top250电影数据进行分析
使用python抓取豆瓣top250电影数据进行分析 抓取豆瓣Top250电影数据的链接和电影名称 代码如下: import urllib.request as urlrequest from bs4 ...
- python 豆瓣评论分析方法_使用python抓取豆瓣top250电影数据进行分析
抓取豆瓣Top250电影数据的链接和电影名称 代码如下: import urllib.request as urlrequest from bs4 import BeautifulSoup impor ...
- [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息
这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对 ...
- 抓取豆瓣的电影排行榜TOP100
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 一个简单的Python爬虫, 用于抓取豆瓣电影Top前1 ...
- 不会写Python代码如何抓取豆瓣电影 Top 250
说到爬虫,大多数人会想到用Python来做,毕竟简单好用,比如想抓取豆瓣电影top250 的所有电影数据. 简单的代码如下: import requests from bs4 import Beaut ...
最新文章
- 各种 AI 数据增强方法,都在这儿了
- Android调用浏览器打开网址遇到的问题
- window清理垃圾
- ORA-07445导致实例崩溃的解决【The solution of instance crush by ORA-07445】
- 2013年中国数据库大会PPT
- 2021的第一封拒信来自2021年年度青年活动家本科生奖!
- Vim功能键整理(图片来自mooc)
- 从C# String类理解Unicode(UTF8/UTF16)
- 自己开发的一款基于PagedDataSource的datalist repeater控件,只需要在源程序中添加三行代码,即可实现通用分页
- python中协程的理解_python协程的理解
- 辨异 —— Java 中 String 的相等性比较
- php项目打不开DNS,电脑无法打开网页显示错误代码dns_probe_possible怎么解决?
- python中seek函数_Python seek()函数
- OllyDbg基本使用
- Unity 水墨风格Shader
- mysql数据库空间不足_mysql空间不足怎么解决?
- C#学习资源网站汇总
- 2021年浏阴一中高考成绩查询,2021年湖南高考最高分多少分,历年湖南高考状元
- Express搭建服务器
- 【系统分析师之路】2018年上系统分析师综合知识真题
热门文章
- ios添加桌面记事本用哪款软件?
- 安徽大学高等数学习题册(上)(第二章)
- android模拟器32位下载,【天天安卓模拟器和Internet Explorer 10(32位)哪个好用】天天安卓模拟器和Internet Explorer 10(32位)对比-ZOL下载...
- MapReduce的自定义计数器
- 多项式特征生成--PolynomialFeatures类
- 在python语言中可作为源文件后缀名的是_Python中的标识符不区分大小写。
- 幻13全能本领衔 ROG多款重磅新品发布
- android改变图标颜色
- wift学习笔记之闭包
- “买卖股票的最佳时机” 系列——我来教你稳赚不亏~