`

150行代码写爬虫(一)

阅读更多

目的:爬取某视频网站的所有视频;

工具:scrapy、MySQL、python 2.7;

项目地址:https://gitee.com/dushen666/spider.git

scrapy是一个python的爬虫框架,有兴趣的同学可以了解一下,本篇我将介绍如何用scrapy从零开始编写一个爬虫;

步骤↓

  1. 安装python 2.7,并配置好环境变量 ,此处不多说。
  2. 安装scrapy:
    pip install Scrapy
     若没有pip请自行安装
  3. 构建一个scrapy项目:进入想要保存项目的路径,执行以下代码:
    scrapy startproject spider
     可以看到当前目录下已经生成了该项目,将项目导入pycharm,项目结构如下:
  4. 在spiders路径下建立我们的爬虫: 

    模块中的内容稍后再介绍!

  5. 建立items,用于保存爬取来的信息,修改items.py:
    import scrapy
    
    class H6080Item(scrapy.Item):
        name = scrapy.Field()
        url = scrapy.Field()
        num = scrapy.Field()
    
    
    class H6080MovieInfo(scrapy.Item):
        name = scrapy.Field()
        director = scrapy.Field()
        actor = scrapy.Field()
        types = scrapy.Field()
        area = scrapy.Field()
        publishtime = scrapy.Field()
        countnumber = scrapy.Field()
        introduce = scrapy.Field()
        picurl = scrapy.Field()
     说明:用过Django的同学可以看出,item与Django的model有点类似,但是item并没有区分那么多的数据类型,使用起来很方便。此处H6080Item用于保存视频名、视频url和该视频是哪一集,H6080MovieInfo用于保存视频名、主演、导演、海报url等信息。(因为我要爬取www.h6080.com上的视频,所以我将items命名为H6080Item和H6080MovieInfo)
  6. 之后就是编写spider的内容了,在此之前我们先分析一下要爬取的页面:
     打开要爬取的主页www.h6080.com,我们可以分析出,该网站主要有四个页面:主页、分类展示页、视频详情页和播放页。他们的url形式如下:
    主页 www.h6080.com  
    分类展示页 www.h6080.com/type/2/3.html 2为类别id,3为页码数
    视频详情页 www.h6080.com/show/36088.html 36088为视频id
    播放页 www.h6080.com/play/36088/1/5.html 36088为视频id,5为集数

    可以看出我们要的H6080Item中的信息均在播放页中,H6080MovieInfo中的信息均在视频详情页中。接下来我们分析这两个页面的HTML源码:

    视频详情页中,所要的主演、导演等信息均在这个<table>中:

    <table class="table table-striped table-condensed table-bordered" style="margin-bottom:10px;font-size:12px;">
    <tbody>
    <tr>
        <td class="span2"><span class="info-label">导演</span></td>
        <td>金晔</td>
    </tr>
    <tr>
        <td class="span2"><span class="info-label">主演</span></td>
        <td id="casts" style="position:relative;">杨子姗 / 郑恺 / 张国立 / 江珊 / 田雷 / 钟楚曦 / 逯子 / 周宸佳 / 王森 / 高晓菲 / 刘立<a class="casts-swith"></a></td>
    </tr>
    <tr>
        <td class="span2"><span class="info-label">类型</span></td>
        <td>剧情 / 爱情</td>
    </tr>
    <tr>
        <td class="span2"><span class="info-label">制片国家</span></td>
        <td>中国大陆</td>
    </tr>
    <tr>
        <td class="span2"><span class="info-label">更新状态</span></td>
        <td>更新至10集 / 共42集</td>
    </tr>
    <tr>
        <td class="span2"><span class="info-label">上映日期</span></td>
        <td>2018-03-26(中国大陆)</td>
    </tr>
    <tr>
    <td class="span2"><span class="info-label">评分</span></td>
    <td>豆瓣:<a rel="nofollow" class="score" target="_blank" href="/">3.0 <i class="glyphicon glyphicon-new-window"></i></a></td>
    </tr>
    </tbody>
    </table>
    

     视频名和海报图片url分别在<h1 class="movie-title">和<img class="img-thumbnail">中:

        <div class="col-md-12">
            <h1 class="movie-title">好久不见2018 <span class="movie-year">(2018)</span></h1>
        </div>
        
        <div class="col-md-9">
            <div class="row">
                <div class="col-md-4" style="padding-right:5px;">
                <a href="/show/41134.html" style="display:block;position:relative;">
                <img class="img-thumbnail" alt="好久不见2018" width="100%" src="http://wx2.sinaimg.cn/mw690/80df6fe6gy1fpqpi212ylj20u019zdlv.jpg">
                    <button class="hdtag">更新至10集 / 共42集</button>
    			</a>
    			<div class="online-button">
                    <a target="_blank" class="btn btn-success btn-block" href="/play/41134.html">立即播放</a>
                </div>
                <div class="col-md-6 left-bt" data-toggle="modal" data-target="#addresource">
                    <i class="glyphicon glyphicon-pencil"></i> 发布
                </div>
                <div class="col-md-6 icon-heart left-bt" id="add_fav" onclick="add_fav(1)">
                    <i class="glyphicon glyphicon-heart"></i> 喜欢
                </div>
    
     

     

     播放页中,视频url在<iframe>的src中,视频名和集数在<h3 class="movie-title">中:
        <div class="container-fluid" style="padding-top:15px;background:#FFF;position:relative">
            <h3 class="movie-title">视频名称:好久不见2018 - 第03集</h3>
          <div class="player" id="player">
    <iframe border="0" frameborder="0" height="460" marginheight="0" marginwidth="0" scrolling="no" src="http://api.tianxianle.com/jx/dapi.php?id=qKt1naKhqaajnnBomZNmbWFi" width="100%" allowfullscreen="true" allowtransparency="true"></iframe></div>
    
     
  7. 通过scrapy的命令行工具和选择器(Selectors)调试提取所需信息的语句。先提取详情页的信息,执行以下语句进入命令行工具: 

    scrapy shell "http://www.h6080.com/show/40928.html"
     

     先提取视频名:视频名在<h1 class="movie-title">中,在命令行工具中输入以下代码:
    In [1]: response.xpath('//h1[@class="movie-title"]/text()').extract()[0]
    Out[1]: u'\u9006\u6c34\u5bd2 '
     说明://h1表示取该responsebody的所有<h1>,[@class="movie-title"]表示筛选所有class为movie-title的标签,/text()表示取标签中的内容,extract()的作用是将结果转为list并返回,[0]表示取list[0]。此处只举这一个例子,其他信息的提取方法不多说,若要详细了解selector的使用方法可以查看官方文档。

     

  8. 编辑spider的内容:
    # -*- coding: utf-8 -*-
    """
        Created by 杜神 at 2018/3/21
    """
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    from spider.items import H6080Item, H6080MovieInfo
    from scrapy.contrib.spiders import CrawlSpider, Rule
    from scrapy.contrib.linkextractors import LinkExtractor
    import logging
    import re
    
    class SpiderNo1(CrawlSpider):
        name = 'h6080spider'
        allowed_domains = ['h6080.com']
        start_urls = [
            'http://www.h6080.com',
        ]
        logging.getLogger("requests").setLevel(logging.WARNING
                                               )  # 将requests的日志级别设成WARNING
        logging.basicConfig(
            level=logging.DEBUG,
            format=
            '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
            datefmt='%a, %d %b %Y %H:%M:%S',
            filename='h6080spider.log',
            filemode='w')
    
        rules = (
            # follow所有分类链接/下一页链接/详情页链接
            Rule(LinkExtractor(allow=('\/type\/\d+\.html', '\/type\/\d+\/\d+\.html')), follow=True),
            Rule(LinkExtractor(allow=('play\/\d+\/\d+\/\d+\.html', )), callback='parse_item'),
            Rule(LinkExtractor(allow=('\/show\/\d+\.html', )), callback='parse_movie_info', follow=True),
        )
    
        def parse_item(self, response):
            item = H6080Item()
            item['name'] = response.xpath('//h3[@class="movie-title"]/text()').extract()[0]
            item['url'] = response.xpath('//div[@class="player"]/iframe/@src').extract()[0]
            item['num'] = re.findall('\/\d+\.html', response.url)[0].split('.')[0][1:]
            self.log('find a url! %s' % response.url)
            yield item
    
        def parse_movie_info(self, response):
            item = H6080MovieInfo()
            rows = response.xpath('//td/text()').extract()
            item['director'] = rows[0]
            item['actor'] = rows[1]
            item['types'] = rows[2]
            item['area'] = rows[3]
            try:
                item['publishtime'] = rows[5]
            except Exception:
                item['publishtime'] = '1999-01-01'
            item['name'] = response.xpath('//h1[@class="movie-title"]/text()').extract()[0]
            item['introduce'] = response.xpath('//p[@class="summary"]/text()').extract()[0]
            item['picurl'] = response.xpath('//img[@class="img-thumbnail"]/@src').extract()[0]
            if len(re.findall('\d+', rows[4])) > 0:
                item['countnumber'] = re.findall('\d+', rows[4])[0]
            else:
                item['countnumber'] = 0
            self.log('find a movie! %s' % item['name'])
            yield item
    
     说明:此处继承scrapy的CrawlSpider类,
    name 给该spider取个唯一的名字,此处取名h6080spider
    allowed_domains 允许爬虫访问的域名
    start_urls 爬虫起始url
    logging 日志,不多说
    rules

    Rule(LinkExtractor(allow=('play\/\d+\/\d+\/\d+\.html', )), callback='parse_item')

    若url匹配正则表达式,则由callback指定的方法处理,若未指定,则不处理。follow=True表示是否跟进,默认为True

    parse_item

    用于处理播放页

    parse_movie_info 用于处理视频详情页
  9. 执行爬虫,进入项目根路径,执行以下命令:
    scrapy crawl h6080spider -o result.json
     可以看到路径下生成了result.json,该文件以json的形式存储了H6080MovieInfo和H6080Item

 到此一个爬虫就已经可以工作了,但是这还远远不行,我们要把爬取的信息存储到数据库中,并且要实现去重功能,否则会产生大量重复数据,关于去重和数据库存储我会在下一篇文章中介绍。

 

最后再次附上项目地址:https://gitee.com/dushen666/spider.git

1
0
分享到:
评论

相关推荐

    爬虫代码(爬虫小说代码)

    总的来说,这个“爬虫代码(爬虫小说代码)”项目提供了从零开始学习爬虫技术的完整实例,不仅有实际的代码实现,还有配套的视频教程,对于初学者来说是一个很好的起点。通过学习和实践这个项目,学习者可以了解到...

    好玩的爬虫代码 好玩的爬虫代码 好玩的爬虫代码 好玩的爬虫代码 好玩的爬虫代码 好玩的爬虫代码

    好玩的爬虫代码。好玩的爬虫代码。好玩的爬虫代码。好玩的爬虫代码。好玩的爬虫代码。好玩的爬虫代码。

    java写爬虫代码

    代码中提到了`robots.txt`文件,这是一个标准,用来告诉爬虫哪些页面可以抓取,哪些不能。`isRobotAllowed(URL urlToCheck)`方法用于检查给定的URL是否在robots.txt文件的允许范围内。 6. **网络连接与输入输出流*...

    自己动手写爬虫源代码(第一章)

    在本资源中,你将找到罗刚所著《自己动手写爬虫》一书的第一章相关的源代码。这本书旨在引导读者逐步了解并实践爬虫技术,通过实际编写代码来学习和掌握这一技能。作者罗刚深入浅出地讲解了爬虫的基础知识,使初学者...

    Java写的爬虫代码

    这是java写的爬虫代码,很好用。

    81个Python爬虫源代码

    81个Python爬虫源代码,内容包含新闻、视频、中介、招聘、图片资源等网站的爬虫资源

    《自己动手写网络爬虫》第一章代码

    《自己动手写网络爬虫》第一章的代码涵盖了网络爬虫的基础知识,主要针对Java编程语言。这章内容是这本书的入门部分,旨在帮助读者建立起对网络爬虫的基本理解和实际操作能力。在这里,我们将深入探讨这一章节涉及的...

    五行代码实现爬虫,然后解析

    五行代码实现爬虫,然后解析

    一个爬虫代码

    一个 爬虫 代码 python

    自己动手写网络爬虫pdf+源代码

    《自己动手写网络爬虫》是一本面向实践的教程,旨在帮助读者深入理解网络爬虫的工作原理,并通过实际操作掌握其编写技术。该资源包括PDF格式的书籍和配套的源代码,为学习者提供了理论与实践相结合的学习环境。 ...

    爬虫代码实现.rar

    Python 是一种非常流行的爬虫编程语言,因其语法简洁、库丰富而受到青睐。XPath 是一种在 XML 和 HTML 文档中查找信息的语言,它在爬虫中用于定位网页元素,提取我们需要的数据。 在本项目“爬虫代码实现”中,我们...

    Python网络爬虫代码

    【Python网络爬虫代码】是基于Python3编程语言实现的一款数据抓取工具,主要用于从互联网上,特别是百度百科这类网站,自动获取指定网页中的信息。爬虫技术在信息技术领域扮演着重要角色,它能帮助我们高效地提取...

    scrapy爬虫项目代码.zip

    scrapy爬虫项目代码.zipscrapy爬虫项目代码.zipscrapy爬虫项目代码.zipscrapy爬虫项目代码.zipscrapy爬虫项目代码.zipscrapy爬虫项目代码.zipscrapy爬虫项目代码.zipscrapy爬虫项目代码.zipscrapy爬虫项目代码....

    自己写的一段爬虫类练习代码

    经典的爬虫代码,供大家学习如何防爬虫,请大家慎重爬虫,以免给别人造成不必要的损失~

    81个Python爬虫源代码+九款开源爬虫工具.doc

    - Gecco是一款Java爬虫框架,整合了多个库如jsoup、httpclient、fastjson等,允许开发者使用jQuery风格的选择器编写爬虫,具有优秀的可扩展性和基于开闭原则的设计。 3. **WebCollector**: - WebCollector是基于...

    网页爬虫源代码

    "vrawler3"可能是一个网页爬虫项目的第三版源代码。它可能包含了上述提到的各种功能模块,比如HTTP请求、HTML解析、链接提取、数据存储等。通过查看这个源代码,开发者可以学习到如何构建一个完整的网页爬虫系统,...

    C++ 网络爬虫代码

    【C++ 网络爬虫代码】是一个基于C++编程语言实现的网络爬虫程序,利用了Winsock库进行网络通信,专为处理HTTP协议设计。本项目旨在教授如何利用C++进行网络爬取,解析HTML内容以及提取图片URL,并将图片下载到本地。...

    自己动手写网络爬虫源代码

    自己动手写网络爬虫源代码是一个极好的学习实践过程,可以帮助理解网页抓取的工作原理,以及如何处理和分析抓取到的数据。在这个过程中,你将涉及多个编程技术和工具,如Python、HTTP协议、正则表达式、数据存储等。...

    爬虫开发Python开发简单爬虫 实例代码.zip

    爬虫开发Python开发简单爬虫 实例代码.zip爬虫开发Python开发简单爬虫 实例代码.zip爬虫开发Python开发简单爬虫 实例代码.zip爬虫开发Python开发简单爬虫 实例代码.zip爬虫开发Python开发简单爬虫 实例代码.zip爬虫...

    一个不需要写代码的爬虫平台,以图形化方式定义爬虫流程,无需代码即可实现一个爬虫

    作为新一代爬虫平台,它以图形化方式定义爬虫流程,不写代码即可完成爬虫。 特性: 支持Xpath/JsonPath/css选择器/正则提取/混搭提取 支持JSON/XML/二进制格式 支持多数据源、SQL select/selectInt/selectOne/...

Global site tag (gtag.js) - Google Analytics