资讯专栏INFORMATION COLUMN

爬虫+网站开发实例:电影票比价网

Codeing_ls / 2726人阅读

摘要:注一篇去年的旧文,发现没在知乎发过,过来补个档。于是就有了我们这个小项目电影票比价网在我们这个网页上,会展示出当前热映的电影。涉及到模块主要是用来匹配不同渠道的影院信息代码结构项目主要有三块使用豆瓣每日更新上映的影片列表。

注:一篇去年的旧文,发现没在知乎发过,过来补个档。有个小问题是项目中淘票票的网页反爬提升且变动较多,目前暂不可用了。

时常有同学会问我类似的问题:我已经学完了 Python 基础,也照着例子写过一点爬虫代码 / 了解过 django 的入门项目 / 看过数据分析的教程……然后就不知道要做什么了。接下来应该 如何继续提升编程能力呢

我的答案很简单:

做项目

不要把“项目”想象得太复杂,觉得一定是那种收钱开发的才能称作项目(如果有这种项目当然会更好)。对于刚刚跨入编程世界的你来说,任何一个小项目都是好的开始。你所需要的,就是 一双发现问题的眼睛 。生活中工作中的一些小事情小麻烦,多想一步,是不是可以写一小段代码来解决。

一开始,或许你的解决方案很笨拙,很复杂,本来5分钟就能搞定的事情,你写代码却花了一个小时。但对你来说,此时的目的并不只是解决问题,而是这个过程本身。 在折腾的过程中,你的经验才会增长 。这是你单纯看教程所无法达到的,再好的教程也替代不了动手。(有时候会有人评论说,这功能直接用xxx就可以了,干嘛还要自己写代码。对此我不做评价,因为我知道他不是来学编程的。)

我们编程教室也陆续提供了一些项目案例。你可以参考我们的示例代码,或者更好的是,自己去思考一个解决方案并实现。我们的案例不少都放在了网站 http:// lab.crossincode.com 上演示,欢迎大家去浏览。内容会持续更新,可留意我们微信公众号和知乎专栏里的文章。

今天介绍的这个项目就源自生活中的一个场景: 买电影票

当你打算周末出门看场电影的时候,就必然面临三个终极问题:

看什么?

什么时候看?

去哪儿看?

通常你只需要打开常用的购票App,选一部最近口碑不错的片子,去熟悉的影院看看有哪些场次就可以了。但有时你也会发现,同样一部电影,不远的两家影院,价格就差很多,不同的购票App也会因为促销活动之类有不同的优惠力度,一张票可能会相差几十元。但如果每次都去几个App把最近的排片和价格都浏览一遍,那也太麻烦了。于是就有了我们这个小项目:

电影票比价网

在我们这个网页上,会展示出当前热映的电影。进入每部电影,选择 城市区域影院日期 ,就可以看到最近的 排片时间 和不同渠道的 价格 。目前,我们是从 糯米淘票票时光网 三个渠道获取价格来做演示。(注:项目中淘票票现已失效)

实现技术

本项目是对爬虫和Web网站的综合运用,适合已经有掌握python基础,并且对此有一些了解的同学作为练手项目。涉及到模块主要是:

Django(1.10)

requests

bs4

python-Levenshtein(用来匹配不同渠道的影院信息)

代码结构

项目主要有三块:

douban_movie

使用豆瓣 api 每日更新上映的影片列表。

movie_tickets

项目的核心部分,用来处理影院信息和排名信息的抓取。

django

项目本身是一个网站,整体是在 django 的框架之中。

开发思路

使用爬虫爬取各电影票网站所有的电影院链接,作为基本的数据保存下来

使用豆瓣 API 获取当日上映的电影信息,并每天更新

django 显示电影信息,提供给用户选择电影院的接口

将影片和影院信息发送到 django 后台进行查询,爬取对应的排片信息显示给用户

代码片段

 # 获取淘票票某地区某电影院某影片价格# 
1. 根据查询条件获取影院 id# 
2. 根据影院 id 获取该影院正在上映电影# 
3. 获取 查询电影的排片时间表链接# 
4. 拿到价格
def get_movie_tickets(self, *args):
    assert len(args) == 4, "not enough parameters 
 type in -h for help"
    movie_name = args[3]
    mt = TaoppDt()
    cinema_url = mt.search(*args[:3])
    assert cinema_url, "未查询到该电影院"
    pattern = re.compile(r"cinemaId=(d+)")
    cinemaid = re.findall(pattern, cinema_url)[0]
    film_url = "https://dianying.taobao.com/cinemaDetailSchedule.htm?cinemaId=" + str(cinemaid)
    content = self.rq.req_url(film_url)
    assert content, "请求失败,请检查 /utils/req.py 中 req_url 函数是否工作正常"
    soup = bs4.BeautifulSoup(content, "lxml")
    soup_film = soup.find("a", text=re.compile(movie_name))
    assert soup_film, "未查询到该电影"
    film_param = soup_film["data-param"]
    return self._get_ticket_info(film_param)

其他说明

项目为了有一个较好的交互效果,在页面上用到了不少 Ajax 请求。这需要有一定的前端 js 基础。对网页前端不熟悉的同学可暂且略过,重点关注后端实现。

不同渠道对于同一家影院的名称很可能有出入,因此这里使用了 python-Levenshtein 来对文本进行匹配。

代码里在抓取时有用到我们的另一个项目: IP代理池 (参见 Crossin:听说你好不容易写了个爬虫,结果没抓几个就被封了?)。但因为服务器资源有限,有时拿不到可用的代理。各位自己电脑上运行代码时,可尝试把 requests 的 proxies 参数去除。

作为一个演示项目,必然存在一些bug(当然商业项目也不可能没有bug),加上爬虫的程序极有可能因为对方网站更新而失效。所以如果遇到问题,欢迎大家给我们报错。

代码下载

完整的代码详细代码说明 已上传 Github,获取下载地址请在 公众号(Crossin的编程教室) 里回复 电影票

════

其他文章及回答:

学编程:如何自学Python | 新手引导 | 一图学Python

开发案例:智能防挡弹幕 | 红包提醒 | 流浪地球

欢迎搜索及关注: Crossin的编程教室

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43305.html

相关文章

  • BeautifulSoup:页解析利器上手简介

    摘要:文档写得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代码中派上用场了。 关于爬虫的案例和方法,我们已讲过许多。不过在以往的文章中,大多是关注在 如何把网页上的内容抓取下来 。今天我们来分享下,当你已经把内容爬下来之后, 如何提取出其中你需要的具体信息 。 网页被抓取下来,通常就是 str 字符串类型的对象 ,要从里面寻找信息,最直接的想法就是直接通过字符串的 find 方法 ...

    Carl 评论0 收藏0
  • 这可能是我用过最“强大”的API:Marvel API

    我们在编程教室中写过不少使用 API 开放接口 的案例,比如: 查询书影音的 豆瓣 (爬虫+网站开发实例:电影票比价网) 查询股票的 tushare (想用 Python 做数据分析?先玩玩这个再说) 翻译单词的 词霸 (【每周一坑解答】自动翻译) 用来做人工智能的 腾讯AI (调教属于你的贾维斯) 但以上这些都不是我今天要说的。今天要说的这个接口,之所以称为强大,因为 它返回的内容里蕴含了未...

    Near_Li 评论0 收藏0
  • 爬虫入门

    摘要:通用网络爬虫通用网络爬虫又称全网爬虫,爬取对象从一些种子扩充到整个。为提高工作效率,通用网络爬虫会采取一定的爬取策略。介绍是一个国人编写的强大的网络爬虫系统并带有强大的。 爬虫 简单的说网络爬虫(Web crawler)也叫做网络铲(Web scraper)、网络蜘蛛(Web spider),其行为一般是先爬到对应的网页上,再把需要的信息铲下来。 分类 网络爬虫按照系统结构和实现技术,...

    defcon 评论0 收藏0
  • 爬虫入门

    摘要:通用网络爬虫通用网络爬虫又称全网爬虫,爬取对象从一些种子扩充到整个。为提高工作效率,通用网络爬虫会采取一定的爬取策略。介绍是一个国人编写的强大的网络爬虫系统并带有强大的。 爬虫 简单的说网络爬虫(Web crawler)也叫做网络铲(Web scraper)、网络蜘蛛(Web spider),其行为一般是先爬到对应的网页上,再把需要的信息铲下来。 分类 网络爬虫按照系统结构和实现技术,...

    Invoker 评论0 收藏0
  • Python 爬虫-模拟登录知乎-爬取拉勾职位信息

    摘要:本文代码地址爬取豆瓣电影爬取拉勾网职位信息模拟登陆知乎为什么没人给我点赞。职位名职位信息运行结果模拟登录知乎通过开发者工具,获取的数据。 我开通了公众号【智能制造专栏】,以后技术类文章会发在专栏。用Python写爬虫是很方便的,最近看了xlzd.me的文章,他的文章写的很到位,提供了很好的思路。因为他的文章部分代码省略了。下面是基于他的文章的三个代码片段:基于Python3,Pytho...

    joyvw 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<