【Python】从0开始写爬虫——豆瓣电影
1. 最近略忙。。java在搞soap,之前是用工具自动生成代码的。最近可能会写一个soap的java调用
2. 这个豆瓣电影的爬虫。扒信息的部分暂时先做到这了。扒到的信息如下
from scrapy import app import re header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Host': 'movie.douban.com', 'Accept-Language': 'zh-CN,zh;q=0.9' } movie_url = "https://movie.douban.com/subject/27132728/?tag=%E7%83%AD%E9%97%A8&from=gaia" m_id = re.search("[0-9]+", movie_url).group() # 获取soup对象 soup = app.get_soup(url=movie_url, headers=header, charset="utf-8") content = soup.find(id="content") # 抓取电影名字和上映年份 m_name = content.find("h1").find("span").string m_year = content.find(class_="year").string m_year = m_year[1:-1] # 去掉头尾的括号 # 抓取导演 info = content.find(id="info") m_directer = info.find(attrs={"rel": "v:directedBy"}).string# 上映日期 m_date = info.find(attrs={"property": "v:initialReleaseDate"}).string m_date = re.search("[-,0-9]+", m_date).group() # 类型 types = info.find_all(attrs={"property": "v:genre"}, limit=2) m_types = [] for type_ in types: m_types.append(type_.string) # 抓取主演,只取前面五个 actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5) m_actors = [] for actor in actors: m_actors.append(actor.string) # 片长 m_time = info.find(attrs={"property": "v:runtime"}).string m_time = re.search("[0-9]+", m_time).group() # 评分 score_info = soup.find(id="interest_sectl") m_score = score_info.find("strong").string m_stars = score_info.find_all(class_="rating_per") m_rate = [] for star in m_stars: m_rate.append(star.string[:-1]) m_votes = score_info.find(attrs={"property": "v:votes"}).string print("id", m_id, "名称", m_name, "年份 ", m_year, "导演 ", m_directer, "主演", m_actors) print("上映日期", m_date, "类型", m_types, "片长", m_time) print("评分", m_score, "星评(从5星到1星)", m_rate, "评价总数", m_votes)
输出如下
id 27132728 名称 致命警告 El aviso 年份 2018 导演 丹尼尔·卡尔帕索罗 主演 ['奥拉·加里多', '劳尔·阿雷瓦洛', '贝伦·奎斯塔', 'Sergio Mur', 'Aitor Luna'] 上映日期 2018-03-23 类型 ['惊悚'] 片长 92 评分 6.4 星评(从5星到1星) ['14.2', '19.9', '41.1', '21.3', '3.5'] 评价总数 445
把这些狗东西封装成一个方法。并且随便找几个豆瓣电影的url试一下。在多尝试几个url之后,会报一些问题,主要是没有进行空判断, 所以稍微修改了一点
from scrapy import app import re def douban_movie(movie_url): header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Host': 'movie.douban.com', 'Accept-Language': 'zh-CN,zh;q=0.9' } m_id = re.search("[0-9]+", movie_url).group() # 获取soup对象 soup = app.get_soup(url=movie_url, headers=header, charset="utf-8") content = soup.find(id="content") # 抓取电影名字和上映年份 m_name = content.find("h1").find("span").string m_year = content.find(class_="year").string m_year = m_year[1:-1] # 去掉头尾的括号 # 抓取导演 info = content.find(id="info") m_directer = info.find(attrs={"rel": "v:directedBy"}).string # 上映日期 m_date = info.find(attrs={"property": "v:initialReleaseDate"}).string m_date = re.search("[-,0-9]+", m_date).group() # 类型 types = info.find_all(attrs={"property": "v:genre"}, limit=2) m_types = [] for type_ in types: m_types.append(type_.string) # 抓取主演,只取前面五个 actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5) m_actors = [] for actor in actors: m_actors.append(actor.string) # 片长 m_time = info.find(attrs={"property": "v:runtime"}) m_time = re.search("[0-9]+", m_time.string).group() if m_time else 0 # 评分 score_info = soup.find(id="interest_sectl") m_score = score_info.find("strong").string m_stars = score_info.find_all(class_="rating_per") m_rate = [] for star in m_stars: m_rate.append(star.string[:-1]) m_votes = score_info.find(attrs={"property": "v:votes"}) m_votes = m_votes.string if m_votes else 0 print("id", m_id, "名称", m_name, "年份 ", m_year, "导演 ", m_directer, "主演", m_actors) print("上映日期", m_date, "类型", m_types, "片长", m_time) print("评分", m_score, "星评(从5星到1星)", m_rate, "评价总数", m_votes) douban_movie("https://movie.douban.com/subject/30236775/?from=showing") douban_movie("https://movie.douban.com/subject/26842702/?tag=%E7%83%AD%E9%97%A8&from=gaia") douban_movie("https://movie.douban.com/subject/26973784/?tag=%E6%9C%80%E6%96%B0&from=gaia") douban_movie("https://movie.douban.com/subject/30249296/?tag=%E7%83%AD%E9%97%A8&from=gaia")
输出如下
id 30236775 名称 旅行吧!井底之蛙 年份 2018 导演 陈设 主演 ['王雪沁', '吴凡', '周宗禹', '强光宗', '张艺文'] 上映日期 2018-08-18 类型 ['动画', '奇幻'] 片长 78 评分 None 星评(从5星到1星) [] 评价总数 0 id 26842702 名称 燃烧 버닝 年份 2018 导演 李沧东 主演 ['刘亚仁', '史蒂文·元', '全钟瑞', '金秀京', '崔承浩'] 上映日期 2018-05-16 类型 ['剧情', '悬疑'] 片长 148 评分 7.9 星评(从5星到1星) ['25.9', '48.1', '21.4', '3.2', '1.3'] 评价总数 81519 id 26973784 名称 设局 La niebla y la doncella 年份 2017 导演 安德烈斯·M·科佩尔 主演 ['基姆·古铁雷斯', '薇洛妮卡·恩切圭', '奥拉·加里多', '罗伯托·阿拉莫'] 上映日期 2017-09-08 类型 ['惊悚'] 片长 0 评分 5.2 星评(从5星到1星) ['1.2', '9.8', '42.0', '40.0', '7.1'] 评价总数 320 id 30249296 名称 我们的侣行 第二季 年份 2018 导演 张昕宇 主演 ['张昕宇', '梁红'] 上映日期 2018-06-12 类型 ['真人秀'] 片长 0 评分 8.9 星评(从5星到1星) ['59.3', '27.8', '11.1', '1.9', '0.0'] 评价总数 342
又稍微修改了一下
1. 把原方法加了一个返回值返回一个存储数据的字典
2.对数据做了一些转换,主要是把字符串转成数字
3.对电影和电视剧做了一个区分。
from scrapy import app import re import datetime def douban_movie(movie_url): header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Host': 'movie.douban.com', 'Accept-Language': 'zh-CN,zh;q=0.9' } movie = {} m_id = re.search("[0-9]+", movie_url).group() movie["id"] = m_id # 获取soup对象 soup = app.get_soup(url=movie_url, headers=header, charset="utf-8") content = soup.find(id="content") kinds = content.find(class_="episode_list") movie["type"] = 0 if kinds else 1 # 0 :电视剧,1:电影。如果有分集数,为电视剧, 否则就是电影 # 抓取电影名字和上映年份 m_name = content.find("h1").find("span").string movie["name"] = m_name; m_year = content.find(class_="year").string m_year = m_year[1:-1] # 去掉头尾的括号 movie["year"] = m_year # 抓取导演 info = content.find(id="info") m_directer = info.find(attrs={"rel": "v:directedBy"}).string movie["directer"] = m_directer # 上映日期 m_date = info.find(attrs={"property": "v:initialReleaseDate"}).string m_date = re.search("[-,0-9]+", m_date).group() movie["date"] = datetime.datetime.strptime(m_date, '%Y-%m-%d') # 类型 categories = info.find_all(attrs={"property": "v:genre"}, limit=2) m_categories = [] for category in categories: m_categories.append(category.string) movie["categories"] = m_categories # 抓取主演,只取前面五个 actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5) m_actors = [] for actor in actors: m_actors.append(actor.string) movie["actors"] = m_actors # 片长 m_time = info.find(attrs={"property": "v:runtime"}) m_time = int(re.search("[0-9]+", m_time.string).group()) if m_time else 0 movie["time"] = m_time # 评分 score_info = soup.find(id="interest_sectl") m_score = score_info.find("strong").string if score_info.find("strong") else 0.0 movie["score"] = float(m_score) if m_score else 0.0 m_stars = score_info.find_all(class_="rating_per") m_rate = [] for star in m_stars: m_rate.append(float(star.string[:-1])) movie["stars"] = m_rate m_votes = score_info.find(attrs={"property": "v:votes"}) m_votes = int(m_votes.string) if m_votes else 0 movie["vote"] = m_votes return movie print(douban_movie("https://movie.douban.com/subject/30236775/?from=showing")) print(douban_movie("https://movie.douban.com/subject/26842702/?tag=%E7%83%AD%E9%97%A8&from=gaia")) print(douban_movie("https://movie.douban.com/subject/26973784/?tag=%E6%9C%80%E6%96%B0&from=gaia")) print(douban_movie("https://movie.douban.com/subject/30249296/?tag=%E7%83%AD%E9%97%A8&from=gaia"))
输出
{'id': '30236775', 'type': 1, 'name': '旅行吧!井底之蛙', 'year': '2018', 'directer': '陈设', 'date': datetime.datetime(2018, 8, 18, 0, 0), 'categories': ['动画', '奇幻'], 'actors': ['王雪沁', '吴凡', '周宗禹', '强光宗', '张艺文'], 'time': 78, 'score': 0.0, 'stars': [], 'vote': 0} {'id': '26842702', 'type': 1, 'name': '燃烧 버닝', 'year': '2018', 'directer': '李沧东', 'date': datetime.datetime(2018, 5, 16, 0, 0), 'categories': ['剧情', '悬疑'], 'actors': ['刘亚仁', '史蒂文·元', '全钟瑞', '金秀京', '崔承浩'], 'time': 148, 'score': 7.9, 'stars': [25.9, 48.1, 21.5, 3.2, 1.3], 'vote': 83194} {'id': '26973784', 'type': 1, 'name': '设局 La niebla y la doncella', 'year': '2017', 'directer': '安德烈斯·M·科佩尔', 'date': datetime.datetime(2017, 9, 8, 0, 0), 'categories': ['惊悚'], 'actors': ['基姆·古铁雷斯', '薇洛妮卡·恩切圭', '奥拉·加里多', '罗伯托·阿拉莫'], 'time': 0, 'score': 5.2, 'stars': [1.2, 9.8, 41.8, 40.2, 7.0], 'vote': 321} {'id': '30249296', 'type': 0, 'name': '我们的侣行 第二季', 'year': '2018', 'directer': '张昕宇', 'date': datetime.datetime(2018, 6, 12, 0, 0), 'categories': ['真人秀'], 'actors': ['张昕宇', '梁红'], 'time': 0, 'score': 8.9, 'stars': [59.3, 28.8, 10.2, 1.7, 0.0], 'vote': 400}
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
WiFi破解这个技术很普通!Python几行代码就可以做到!进来就学会
是不是还在为WiFi密码发愁,甚至有时候还忘掉自己家的WiFi密码,没关系,今天我给大家带来几个破解WiFi密码的案例!我先说明下这个东西一点都不高端,甚至看起来有点糟糕,而且用的是单线程~。 案例一: 导入模块 if reply != b’OK ’:判断需要修改 配置扫描器 扫描周围热点 热点测试 案例 结果还行,大家的安全意识还是比较强的哈哈哈。 案例二 第二步: 怎么看WiFi有没有连上呢? 第三步: 连接WiFi,需要怎么做呢? 在代码的if语句前补充代码就可以了 看一下源码,会发现非常简单 连接WiFi成功 第四步: 好了现在设计暴力破解了 完成了的代码 这个代码是完成了,但是效率不行,这个案例就讲到这里。 案例三: 根据字典文件,使用python进行暴力破解,程序很简单 注:针对没有验证码的情况 实例代码: 开发环境推荐 小编根据大家的需求我把Python的一些学习资料进行了分类,从零基础到项目实战的学习资料加q u n 227-435-450免费分享,希望你在行业前途无量。
- 下一篇
C#语法——事件,逐渐边缘化的大哥。
事件是C#的基础之一,学好事件对于了解.NET框架大有好处。 事件最常见的比喻就是订阅,即,如果你订阅了我的博客,那么,当我发布新博客的时候,你就会得到通知。 而这个过程就是事件,或者说是事件运行的轨迹。 事件是发散,以我的博客为核心,向所有订阅者发送消息。我们把这种发散称之为[多播]。 最常见的事件用途是窗体编程,在Windows窗体应用程序和WPF应用程序中。 当在窗体中点击按钮,移动鼠标等事件时,相应的后台程序会收到通知,再执行代码。 事件的定义官方对事件的说明是这样的:类或对象可以通过事件向其他类或对象通知发生的相关事情。 换成正常语言就是,事件可以定义成静态的或普通的,所以事件就可以由声明的对象调用,也可以直接通过类调用静态事件。 事件是C#中的一种类型,除了框架为我们定义好的事件外,我们还可以自定义事件,用event关键字来声明。 下面我们来看最基础的事件定义。 public delegate void TestDelegate(string message); public event TestDelegate testEvent; 我们首先定义了一个委托,然后利用eve...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果