爬取豆瓣排名前100的电影

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

最近很多工作需要用到爬虫去爬取各种数据。本人也不是专业爬虫攻城狮,之前也没做过爬虫的相关工作。现在实际中遇到了要用,那就只好硬着头皮上吧。趁着周末稍微有点时间,网上找了找爬虫相关的资料与项目,然后参考其中某一个比较简单一些的,先上手实际搞一个练练手再说。

1.爬虫的一般思路

爬虫的基本想法就是以一个初始的url为起点,从这个url出发获得更多的url,并从这些网页中获取想要的数据。像google或者baidu这种级别的公司,爬虫是有非常复杂的算法与非常庞大的工程基础去实现的。我们现在是入门阶段,暂且先不考虑那么复杂的逻辑,先从最简单的获取几个页面的数据开始。

2.可以直接运行的代码

废话不多说,直接上可以运行的源码。此部分代码参考了github上得开源项目,并在原来的基础上做了优化与调整。

#coding:utf-8
import re
import urllib2

"""
1.获取排名前100的电影
2.每页电影的数量是25个
3.获得的html页面中,跟电影名相关的有是这行:
    <span class="title">肖申克的救赎</span>
  如下这行跟上一行的结构类似,所以正则匹配的时候需要将此行去掉:
    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
"""
class SpiderDouBan(object):

    def __init__(self):
        self.page = 0
        self.base_url = "http://movie.douban.com/top250?start={page}&filter=&type="
        self.result = []
        self._index = 1

    def get_page_html(self):
        url = self.base_url
        try:
            my_page = urllib2.urlopen(url.format(page = self.page * 25)).read().decode("utf-8")
        except urllib2.URLError, ex:
            if hasattr(ex, "code"):
                print "The server couldn't fulfill the request."
                print "Error code: %s" % ex.code
            elif hasattr(ex, "reason"):
                print "We failed to reach a server. Please check your url and read the Reason"
                print "Reason: %s" % ex.reason

        return my_page

    def get_index_and_name(self,my_page):
        tmp_result = []
        items = re.findall(r'<span.*?class="title">(.*?)</span>', my_page, re.S)
        for item in items:
            if item.find("&nbsp") == -1 :
                tmp_result.append("top" + str(self._index) + " " + item)
                self._index += 1

        self.result.extend(tmp_result)

    def start_spider(self):
        while self.page <= 3:
            my_page = self.get_page_html()
            self.get_index_and_name(my_page)
            self.page += 1

def main():
    spider = SpiderDouBan()
    spider.start_spider()
    for item in spider.result:
        print item

if __name__ == '__main__':
    main()

3.代码运行结果

top1 肖申克的救赎
top2 这个杀手不太冷
top3 霸王别姬
top4 阿甘正传
top5 美丽人生
top6 千与千寻
top7 辛德勒的名单
top8 泰坦尼克号
top9 盗梦空间
top10 机器人总动员
top11 海上钢琴师
top12 三傻大闹宝莱坞
top13 忠犬八公的故事
top14 放牛班的春天
top15 大话西游之大圣娶亲
top16 教父
top17 龙猫
top18 乱世佳人
top19 楚门的世界
top20 天堂电影院
top21 当幸福来敲门
top22 触不可及
top23 搏击俱乐部
top24 十二怒汉
top25 指环王3:王者无敌
top26 无间道
top27 熔炉
top28 怦然心动
top29 罗马假日
top30 天空之城
top31 少年派的奇幻漂流
top32 大话西游之月光宝盒
top33 鬼子来了
top34 两杆大烟枪
top35 蝙蝠侠:黑暗骑士
top36 飞屋环游记
top37 星际穿越
top38 飞越疯人院
top39 窃听风暴
top40 活着
top41 海豚湾
top42 闻香识女人
top43 V字仇杀队
top44 美丽心灵
top45 教父2
top46 指环王2:双塔奇兵
top47 指环王1:魔戒再现
top48 哈尔的移动城堡
top49 天使爱美丽
top50 情书
top51 死亡诗社
top52 美国往事
top53 七宗罪
top54 钢琴家
top55 狮子王
top56 勇敢的心
top57 致命魔术
top58 被嫌弃的松子的一生
top59 辩护人
top60 剪刀手爱德华
top61 小鞋子
top62 音乐之声
top63 饮食男女
top64 控方证人
top65 低俗小说
top66 入殓师
top67 本杰明·巴顿奇事
top68 沉默的羔羊
top69 蝴蝶效应
top70 黑客帝国
top71 拯救大兵瑞恩
top72 玛丽和马克思
top73 西西里的美丽传说
top74 素媛
top75 心灵捕手
top76 幽灵公主
top77 第六感
top78 阳光灿烂的日子
top79 让子弹飞
top80 大鱼
top81 春光乍泄
top82 射雕英雄传之东成西就
top83 大闹天宫
top84 阳光姐妹淘
top85 重庆森林
top86 上帝之城
top87 禁闭岛
top88 甜蜜蜜
top89 致命ID
top90 告白
top91 一一
top92 加勒比海盗
top93 爱在黎明破晓前
top94 阿凡达
top95 风之谷
top96 萤火虫之墓
top97 布达佩斯大饭店
top98 狩猎
top99 断背山
top100 爱在日落黄昏时

4.简单的说明

相关的注意事项其实在源码中已经有所注释。再啰嗦几句
1.注意豆瓣的页面是25部电影一页。翻页的时候只有start对应的参数发生变化。
2.在对得到的html代码进行正则匹配的时候,注意有一行的结构与包含电影名一行的结构是一样的,需要进行相应的处理去除。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值