精华内容
下载资源
问答
  • 文档是千辛万苦搞来的,希望可以帮助到大家。下载解压后,打开index.html,之后,你懂得。。
  • Scrapy框架的使用之Scrapy框架介绍.pdf
  • Scrapy 是一个适用于 Python 的一个快速、高层次的、开放源代码的屏幕抓取和 web 抓取的应用程序框架,用于抓取 web 站点并从页面中提取结构化的数据,可用于各种有用的应用程序。 Scrapy 常应用在包括数据挖掘、...

    您的“关注”和“点赞”,是信任,是认可,是支持,是动力…

    如意见相佐,可留言。
    本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。

    1 Scrapy 框架概述

    Scrapy 是一个适用于 Python 的一个快速、高层次的、开放源代码的屏幕抓取和 web 抓取的应用程序框架,用于抓取 web 站点并从页面中提取结构化的数据,可用于各种有用的应用程序。

    Scrapy 常应用在包括数据挖掘、监测、信息处理、存储历史数据(历史档案)或自动化测试等一系列的程序中。通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。

    Scrapy 最初是为屏幕抓取而设计的,但它也可以用来访问 API 或用作通用 Web 搜寻器来提取数据。

    Scrapy 吸引人的地方在于它是一个框架,任何人都可以根据需求便捷的进行修改。它也提供了多种类型爬虫的基类,如 BaseSpider、sitemap 爬虫等。

    2 Scrapy 框架的特点

    2.1 快速而强大

    编写规则以提取数据,然后让 Scrapy 完成其余工作。

    它管理请求,解析 HTML 网页,收集数据并将其保存为所需的格式,不需要为每个其他步骤使用单独的库。

    2.2 容易扩展

    通过设计可扩展,无需接触核心即可轻松插入新功能。

    可以在 Scrapy 中使用中间件。中间件是一种“插件”,可为 Scrapy 添加其他功能。我们可以将很多开源中间件附加到 Scrapy 以获得额外的功能。

    2.3 可移植(跨平台)

    用 Python 编写,可以在 Linux,Windows,Mac 和 BSD 上运行。

    3 Scrapy 框架的架构概述

    概述 Scrapy 体系结构(架构图)及其组件,及其系统内部发生的数据流(由红色箭头显示),还包括对这些组件的简要说明。

    Scrapy 体系结构(架构图)

    如下图所示(来自官方文档):

    在这里插入图片描述

    对组件说明

    • Engine(引擎):Scrapy 引擎负责控制系统所有组件之间的数据流,并在发生某些操作时触发事件。
    • Scheduler(调度器):Scrapy 调度器调度程序接收来自引擎的 request(请求),并对它去重,放入到请求队列中;并在引擎请求它们时使它们排队,并根据队列的取出规则,把请求按顺序返回给引擎。
    • Downloader(下载器):下载器负责获取网页数据并将其返回给引擎,引擎又将其传给 Spiders(爬虫)。
    • Spiders(爬虫):爬虫(Spiders)用来解析 response,提取出 Items 和新的Requests。
    • Item Pipeline(项目管道):一旦爬虫将这些项目提取(或刮取),则项目管道负责处理这些项目。典型的任务包括清理,验证和持久性(例如将项目存储在数据库中)。
    • Downloader middlewares(下载器中间件):Downloader 中间件是位于引擎和Downloader 之间的特定挂钩,数据流在从引擎传递到 Downloader 时处理请求,以及从 Downloader 传递到 Engine 的响应处理。
      如果需要执行以下操作之一,请使用 Downloader 中间件:
      (1)在将请求发送到下载程序之前处理请求(即,在 Scrapy 将请求发送到网站之前);
      (2)在传递给 Spiders 之前更改收到的响应;
      (3)发送新的请求,而不是将收到的响应传递给 Spiders;
      (4)将响应传递给 Spiders,而无需获取网页;
      (5)默默地丢弃一些请求。
    • Spider middlewares(爬虫中间件):爬虫中间件是位于引擎和爬虫之间的特定挂钩,并且能够处理爬虫的输入(响应)和输出(项目和请求)。
      如果需要以下操作之一,请使用 Spider 中间件:
      (1)Spiders 回调的后处理输出-更改/添加/删除请求或项目;
      (2)后处理 start_requests;
      (3)处理爬虫异常;
      (4)根据响应内容,对某些请求调用 errback 而不是回调。

    对数据流说明

    首先,Scrapy 会实例化一个 Crawler 对象,在该对象中创建 Spider 对象、Engine 对象,通过 Engine 对象打开 Spider,并生成第一个 request(请求)。

    • ①Scrapy Engine(Scrapy 引擎) 从 Spiders(爬虫)获取初始请求。
    • ②Scrapy Engine(Scrapy 引擎)把请求给调度器,并询问下一次请求。
    • ③Scrapy Scheduler(Scrapy 调度器)对 url 去重,放到队列中等待,并把下一个 request 返回给 Engine。
    • ④Scrapy Engine(Scrapy 引擎)把从调度器返回的 reqest 经过下载中间件交给下载器。
    • ⑤页面下载完成后, Downloader 会生成一个 Response(响应),并通过 Downloader Middlewares(下载器中间件)将其发送到 Engine。
    • ⑥引擎接收来自下载器的响应,并通过爬虫中间件,将其发送到爬虫进行处理。
    • ⑦爬虫接收到响应,解析处理响应,解析出 Items 和 新的 Request ,再通过爬虫中间件提交给 Engine。
    • ⑧引擎把接收到的 Items 提交给 Item Pipeline,把接收到的 Request 提交给调度器。
    • ⑨重复该过程(从步骤1开始),直到不再有 Scheduler 的请求为止 。

    【友情链接】

    微信公众号:码农阿杰

    博客园

    【参考资料】

    Python 官网

    Python 3.8.2 documentation

    Scrapy 官网

    Scrapy 2.2 documentation

    展开全文
  • 学习一个新技术 新语言的时候 查看手册 文档真的很烦 不断的翻页 下一章节...... 所以: 我总是想找到 哪里可以一页查看文档 不需要一个一个去点击下一页 怎么查看文档手册进行一页展示全部?? 这样也方便网页...

    缘由:

    学习一个新技术 新语言的时候 查看手册 文档真的很烦  不断的翻页  下一章节......

    所以:

    我总是想找到  哪里可以一页查看文档 不需要一个一个去点击下一页

    怎么查看文档手册进行一页展示全部?? 这样也方便网页关键字查找 

    结果:

    于是自己做了一个文档手册一页查看全部的方法 目前只有少量文档的查看功能  后期不断补全  欢迎加入!!!

    核心代码如下,

    你可以根据自己需要查看的文档  修改对应的url  和css选择器即可

    注意 : 部分页面的图片是相对地址  需要处理补全  有些网站可能禁止了外链 自己想办法解决或者无关的直接去除即可

    /*
         * 依赖 queryList4 的PHP爬虫框架 简单安装一下就可以 composer
         * yii2项目结构
         * 无需数据库 无需其他
         * */
    public function actionWendang()
    {
    // todo: 采用分页的形式 一次加载3-12页面
    // todo: 采用分页的形式 一次加载3-12页面
    // todo: 采用分页的形式 一次加载3-12页面
    // todo: 自己指定或者分页选择
    // todo: 自己指定或者分页选择
    // todo: 自己指定或者分页选择

    // echo 'wengdang 参数:';
    // var_dump(['scrapyd', 'querylist']);
    $wengdang = Yii::$app->request->get('wengdang');
    // var_dump($wengdang);
    // exit();
    $outPageCount = Yii::$app->request->get('shuchuyeshu', 4);
    // var_dump($wengdang);
    // exit();


    // todo: 住区一个文档
    todo: 获取其他文档 并且js 加入主要模块
    /// // todo: 加载更多选项 3,5,8, all全部
    // todo: scrapy框架的文档一页输出
    switch ($wengdang) {
    case 'scrapyd':
    case 'sc':
    $urlstart = 'http://www.scrapyd.cn/doc/123.html';
    $urlselect = 'dl dd ul > li > a';
    $contentselect = 'body > div.container.doc > div';
    break;

    case 'querylist':
    case 'qu':
    // case 'python':
    // case 'py':
    // queryList框架的文档一页输出
    $urlstart = 'https://querylist.cc/docs/guide/v4/overview';
    // todo: querylist
    $urlselect = '#app > div.container-fluid.pl-0.documentation.is-dark > div > div.col-12.col-md-3.sidebar > ul > li > ul > li > a';
    $contentselect = '#app > div.container-fluid.pl-0.documentation.is-dark';
    // $contentinsert = '#app > div.container-fluid.pl-0.documentation.is-dark > div';
    break;

    case 'python':
    case 'py':
    // queryList框架的文档一页输出
    $urlstart = 'https://www.runoob.com/python/python-tutorial.html';
    // todo: querylist
    $urlselect = '#leftcolumn > a';
    $contentselect = 'body > div.container.main > div > div.col.middle-column > div > div.article-body';
    $contentselect = 'body > div.container.main > div';
    break;

    default:
    var_dump('没有参数');
    exit();
    break;
    }


    $parseTheUrl = parse_url($urlstart);
    $host = $parseTheUrl['host'] ?? '';

    // 计算url有几段
    $urlCount = count(mbsplit('/', $urlstart));

    try {
    $ql = QueryList::get(
    // $ql = QueryList::query(
    $urlstart, [], [
    // 'headers' => [
    // 'origin' => 'www.baidu.com'
    // //填写从浏览器获取到的cookie
    // // 'Cookie' => '_s_tentry=www.baidu.com; Ap...'
    // ],
    'verify' => false
    ]
    );// todo: 不输出 最后统一输出
    // todo: 不输出 最后统一输出
    // todo: 不输出 最后统一输出
    // echo $resContent = $ql->getHtml();
    $resContent = $ql->getHtml();// todo: 注意是 attrs , 不是 attr
    // var_dump($resContent);
    // return '';
    $hrefs = $ql->find($urlselect)->attrs('href');
    $currentUrlFinded = 0;

    // echo $ql->getHtml();
    // return '';
    // var_dump($currentUrlFinded);
    // exit();
    $contentAdd = '';
    $echoCount = 1; // 输出了几个页面 避免太多 太慢 或者请求被禁止
    // var_dump($hrefs);
    // exit();
    foreach ($hrefs as $index => $item) {

    // todo: 间隔
    // sleep(rand(1, 3));

    // todo: 如果是
    if (strpos(trim($urlstart), trim($item))) {
    $currentUrlFinded = 1;
    continue;
    }

    if ($echoCount < $outPageCount && $currentUrlFinded) {
    $echoCount ++;
    // var_dump($echoCount);
    // exit();
    // todo: 下一页是否有host 没有就补充
    $parsenexturl = parse_url($item);
    // $parsenexturl['host'] ?? $item = $parseTheUrl['scheme'] . '://' . $host . '/' . $item;
    $parsenexturl['host'] ?? $item = $parseTheUrl['scheme'] . '://' . $host . $item;


    $parsenexturl = parse_url($item);

    // var_dump($urlCount);
    // exit();
    // 部分url不完整 缺失
    if(count(mbsplit('/', $item)) != $urlCount){
    // echo '不完整url';
    // var_dump($parsenexturl);
    // echo '<br>';
    // echo '<br>';
    continue;
    }


    todo: ,无法多次请求
    // $qlnext = ''; // 每次重置--无效
    $qlnext = QueryList::get(
    $item, [], [
    // 'headers' => [
    // 'origin' => 'www.baidu.com'
    // //填写从浏览器获取到的cookie
    // // 'Cookie' => '_s_tentry=www.baidu.com; Ap...'
    // ]
    'verify' => false
    ]
    );
    $resContent .= '<b><hr></b>';
    $resContent .= $qlnext->find($contentselect)->html();

    // include 'phpQuery/phpQuery.php';
    // phpQuery::newDocumentFile('http://news.sina.com.cn/china');
    // echo pq(".blkTop h1:eq(0)")->html();

    }

    }
    } catch (\Exception $e) {

    var_dump('检查一下是否断网了 无法爬虫获取数据报错');
    var_dump($e->getMessage());
    var_dump($e->getLine());
    exit();
    }

    // todo: python爬虫文档图片url
    // todo: python爬虫文档图片url
    // todo: python爬虫文档图片url
    $resContent = str_replace('src="/', 'src="' . $parseTheUrl['scheme'] . '://' . $host . '/', $resContent);
    $resContent = str_replace('href="/', 'href="' . $parseTheUrl['scheme'] . '://' . $host . '/', $resContent);

    echo $resContent;
    // todo: 只能exit 不能return
    // todo: 只能exit 不能return
    // todo: 只能exit 不能return
    exit();
    }
     
     

     

    转载于:https://www.cnblogs.com/stillstep/p/10958980.html

    展开全文
  • 1.安装和文档 安装:通过pip install scrapy即可安装。...Scrapy中文文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html 注意事项: 在ubuntu上安装scrapy之前,需要先安装以下依赖: sudo apt-...

    1.安装和文档

    • 安装:通过pip install scrapy即可安装。
    • Scrapy官方文档:http://doc.scrapy.org/en/latest
    • Scrapy中文文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html
    • 注意事项:
    在ubuntu上安装scrapy之前,需要先安装以下依赖:
    sudo apt-get install python3-dev build-essential python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev,然后再通过pip install scrapy安装。
    如果在windows系统下,提示这个错误ModuleNotFoundError: No module named 'win32api',那么使用以下命令可以解决:pip install pypiwin32。

    2.快速入门
    2.1 创建项目
    要使用Scrapy框架创建项目,需要通过命令来创建。首先进入到你想把这个项目存放的目录。
    然后使用以下命令创建:scrapy startproject [项目名称]
    2.2 目录结构介绍

    # 创建一个项目步骤
    # 2.1.1 在D盘创建一个文件夹`spiders_code`
    # 2.1.2 打开cmd终端,cd到刚才创建的文件夹`spiders_code`
    # 2.1.3 执行命令`D:\spiders_code> scrapy startproject qsbk`创建项目

    1445976-20190224183509097-215172239.png

    以下介绍下主要文件的作用:

    • items.py:用来存放爬虫爬取下来数据的模型。
    • middlewares.py:用来存放各种中间件的文件。
    • pipelines.py:用来将items的模型存储到本地磁盘中。
    • settings.py:本爬虫的一些配置信息(比如请求头、多久发送一次请求、ip代理池等)。
    • scrapy.cfg:项目的配置文件。
    • spiders包:以后所有的爬虫,都是存放到这个里面

    3.使用Scrapy框架爬取糗事百科段子
    3.1 使用命令创建一个爬虫

    D:\spiders_code\qsbk>scrapy genspider qsbk_spider "qiushibaike.com"

    1445976-20190224190156832-995355028.png

    创建了一个名字叫做qsbk的爬虫,并且能爬取的网页只会限制在qiushibaike.com这个域名下。
    创建爬虫后,再看下目录结构变化
    1445976-20190224190239139-1646462706.png

    3.2爬虫代码解析

    import scrapy
    
    class QsbkSpider(scrapy.Spider):
        name = 'qsbk'
        allowed_domains = ['qiushibaike.com']
        start_urls = ['http://qiushibaike.com/']
    
        def parse(self, response):
            pass

    其实这些代码我们完全可以自己手动去写,而不用命令。只不过是不用命令,自己写这些代码比较麻烦。
    要创建一个Spider,那么必须自定义一个类,继承自scrapy.Spider,然后在这个类中定义三个属性和一个方法。

    • name:这个爬虫的名字,名字必须是唯一的。
    • allow_domains:允许的域名。爬虫只会爬取这个域名下的网页,其他不是这个域名下的网页会被自动忽略。
    • start_urls:爬虫从这个变量中的url开始。
    • parse:引擎会把下载器下载回来的数据扔给爬虫解析,爬虫再把数据传给这个parse方法。这个是个固定的写法。这个方法的作用有两个,第一个是提取想要的数据。第二个是生成下一个请求的url。

    3.3 修改settings.py代码
    在做一个爬虫之前,一定要记得修改setttings.py中的设置。两个地方是强烈建议设置的。

    • ROBOTSTXT_OBEY设置为False。默认是True。即遵守机器协议,那么在爬虫的时候,scrapy首先去找robots.txt文件,如果没有找到。则直接停止爬取。
    • DEFAULT_REQUEST_HEADERS添加User-Agent。这个也是告诉服务器,我这个请求是一个正常的请求,不是一个爬虫。

    3.4 完成的爬虫代码

    # 3.4.1 爬虫部分代码
    import scrapy
    from abcspider.items import QsbkItem
    
    class QsbkSpider(scrapy.Spider):
        name = 'qsbk'
        allowed_domains = ['qiushibaike.com']
        start_urls = ['https://www.qiushibaike.com/text/']
    
        def parse(self, response):
            outerbox = response.xpath("//div[@id='content-left']/div")
            items = []
            for box in outerbox:
                author = box.xpath(".//div[contains(@class,'author')]//h2/text()").extract_first().strip()
                content = box.xpath(".//div[@class='content']/span/text()").extract_first().strip()
                item = QsbkItem()
                item["author"] = author
                item["content"] = content
                items.append(item)
            return items
    # 3.4.2 items.py部分代码
    import scrapy
    class QsbkItem(scrapy.Item):
        author = scrapy.Field()
        content = scrapy.Field()
    # 3.4.3 pipeline部分代码
    import json
    
     class AbcspiderPipeline(object):
         def __init__(self):
    
             self.items = []
    
         def process_item(self, item, spider):
             self.items.append(dict(item))
             print("="*40)
             return item
    
         def close_spider(self,spider):
             with open('qsbk.json','w',encoding='utf-8') as fp:
                 json.dump(self.items,fp,ensure_ascii=False)

    3.5 运行scrapy项目
    运行scrapy项目。需要在终端,进入项目所在的路径,然后scrapy crawl [爬虫名字]即可运行指定的爬虫。如果不想每次都在命令行中运行,那么可以把这个命令写在一个文件中。以后就在pycharm中执行运行这个文件就可以了。
    比如现在新创建一个文件叫做start.py,然后在这个文件中填入以下代码:

    from scrapy import cmdline
    
    cmdline.execute("scrapy crawl qsbk_spider".split())

    转载于:https://www.cnblogs.com/apollo1616/p/10427361.html

    展开全文
  • Scrapy框架

    2020-08-29 11:12:28
    scrapy框架由scrapy引擎(scrapy engine)、调度器(scheduler)、下载器(downloader)、蜘蛛(spider)以及项目管道(item pipeline)组成。 工作流程大致如下: 首先scrapy引擎向调度器发送请求,调度器从url队列...

    scrapy简介

    Scrapy是一个用于抓取web站点和提取结构化数据的应用框架,它可用于广泛的有用应用,如数据挖掘、信息处理或历史存档。

    可以参考scrapy的英文文档或者中文文档

    整体的架构大致如下:
    scrapy框架
    scrapy框架由scrapy引擎(scrapy engine)、调度器(scheduler)、下载器(downloader)、蜘蛛(spider)以及项目管道(item pipeline)组成。

    工作流程大致如下:
    首先scrapy引擎向调度器发送请求,调度器从url队列中取出一个url交给下载器,其次下载器向对应的服务器发送请求,得到响应后将下载网页内容,然后下载器把下载的网页内容交给蜘蛛进行解析,接着如果爬取到数据,则将数据交给项目管道进行加工处理,如果爬取到新的url,则保存在url队列中,进行新一轮的爬取。

    五大组件及其中间件的功能如下:

    • Scrapy引擎:Scrapy引擎相当于指令控制中心,控制整个系统的数据处理流程,触发事务处理流程,负责与各个模块进行通信;
    • Scheduler(调度器):维护待爬取的URL队列,当接受引擎发送的请求时,会从待爬取的URL队列中取出下一个URL返回给调度器。
    • Downloader(下载器):向对应的服务器发送下载页面的请求,用于下载网页内容,并把下载的网页内容交给蜘蛛处理。
    • Spiders(蜘蛛):制定要爬取的网站地址,选择所需数据内容,定义域名过滤规则和网页的解析规则等。
    • Item Pipeline(项目管道):处理由蜘蛛从网页中抽取的数据,主要任务是清洗、验证、过滤、去重和存储数据等。
    • 中间件(Middlewares):中间件是处于Scrapy引擎和Scheduler、Downloader、Spiders之间的构件,主要是处理它们之间的请求及响应。

    scrapy框架爬取豆瓣电影top250
    1、打开cmd,创建一个爬虫项目doubanmovie,会生成一些文件

    scrapy startproject doubanmovie
    

    scrapy.cfg
    items.py
    pipelines.py
    middlewares.py
    settings.py
    spiders/
    2、进入spider/文件夹,创建一个爬虫doubanspider,并指定需爬取的网页

    scrapy genspider doubanspider movie.douban.com
    

    3、items.py 定义爬取的数据内容

    import scrapy
    
    
    class DoubanmovieItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        # 定义数据结构
        # 序号
        MovieNum = scrapy.Field()
        # 电影名
        MovieName = scrapy.Field()
        # 电影介绍
        Introduce = scrapy.Field()
        # 电影星级
        MovieStar = scrapy.Field()
        # 电影评论数
        MovieCount = scrapy.Field()
        # 电影描述
        Describe = scrapy.Field()
    

    4、doubanspider.py 编写spider

    import scrapy
    from doubanmovie.items import DoubanmovieItem
    
    
    class DoubanspiderSpider(scrapy.Spider):
        name = 'doubanspider'
        allowed_domains = ['movie.douban.com']
        start_urls = ['http://movie.douban.com/top250']
    
        def parse(self, response):
            
            MovieList = response.css("ol.grid_view li")
            for item in MovieList:
    
                MovieItem = DoubanmovieItem()
                MovieItem['MovieNum'] = item.css("div.pic em::text").get()
                MovieItem['MovieName'] = item.css("div.hd span.title::text").get()
                try:
                    MovieItem['Introduce'] = item.css("div.bd p::text").get().strip().replace(" ", "")
                except Exception as e:
                    MovieItem['Introduce'] = ''
                MovieItem['MovieStar'] = item.css("div.star span.rating_num::text").get()
                MovieItem['MovieCount'] = item.css("div.star span::text").get()
                try:
                    MovieItem['Describe'] = item.css("p.quote::text").get().strip().replace(" ", "")
                except Exception as e:
                    MovieItem['Describe'] = ''
                yield MovieItem
    
            # 爬取下一页
            NextLink = response.css("div.paginator span.next a::text").getall()
            if "后页>" in NextLink:
                NextPage = response.css("div.paginator span.next a::attr(href)").getall()
                print(NextPage)
                yield scrapy.Request(self.start_urls[0] + NextPage[len(NextPage)-1], callback=self.parse)
    
    

    5、pipelines.py 保存数据

    import json
    
    
    class DoubanmoviePipeline:
        def __init__(self):
            self.f = open("douban.json", "w", encoding='utf-8')
    
        def process_item(self, item, spider):
            content = json.dumps(dict(item), ensure_ascii=False) + ",\n"
            self.f.write(content)
            return item
            
        def close_spider(self, spider):
            self.f.close()
    
    

    6、settings.py 设置文件

    BOT_NAME = 'doubanmovie'
    
    SPIDER_MODULES = ['doubanmovie.spiders']
    NEWSPIDER_MODULE = 'doubanmovie.spiders'
    
    # Crawl responsibly by identifying yourself (and your website) on the user-agent
    # USER_AGENT = 'doubanmovie (+http://www.yourdomain.com)'
    
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = True
    
    # Configure maximum concurrent requests performed by Scrapy (default: 16)
    # CONCURRENT_REQUESTS = 32
    
    # Configure a delay for requests for the same website (default: 0)
    # See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
    # See also autothrottle settings and docs
    # DOWNLOAD_DELAY = 3
    # The download delay setting will honor only one of:
    # CONCURRENT_REQUESTS_PER_DOMAIN = 16
    # CONCURRENT_REQUESTS_PER_IP = 16
    
    # Disable cookies (enabled by default)
    # COOKIES_ENABLED = False
    
    # Disable Telnet Console (enabled by default)
    # TELNETCONSOLE_ENABLED = False
    
    # Override the default request headers:
    # DEFAULT_REQUEST_HEADERS = {
    #   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    #   'Accept-Language': 'en',
    # }
    
    # Enable or disable spider middlewares
    # See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
    # SPIDER_MIDDLEWARES = {
    #    'doubanmovie.middlewares.DoubanmovieSpiderMiddleware': 543,
    # }
    
    # Enable or disable downloader middlewares
    # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
    # DOWNLOADER_MIDDLEWARES = {
    #    'doubanmovie.middlewares.DoubanmovieDownloaderMiddleware': 543,
    # }
    DOWNLOADER_MIDDLEWARES = {
        'doubanmovie.middlewares.MyUserAgent': 544,
    }
    # Enable or disable extensions
    # See https://docs.scrapy.org/en/latest/topics/extensions.html
    # EXTENSIONS = {
    #    'scrapy.extensions.telnet.TelnetConsole': None,
    # }
    
    # Configure item pipelines
    # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
    ITEM_PIPELINES = {
        'doubanmovie.pipelines.DoubanmoviePipeline': 300,
    }
    
    # Enable and configure the AutoThrottle extension (disabled by default)
    # See https://docs.scrapy.org/en/latest/topics/autothrottle.html
    # AUTOTHROTTLE_ENABLED = True
    # The initial download delay
    # AUTOTHROTTLE_START_DELAY = 5
    # The maximum download delay to be set in case of high latencies
    # AUTOTHROTTLE_MAX_DELAY = 60
    # The average number of requests Scrapy should be sending in parallel to
    # each remote server
    # AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
    # Enable showing throttling stats for every response received:
    # AUTOTHROTTLE_DEBUG = False
    
    # Enable and configure HTTP caching (disabled by default)
    # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
    # HTTPCACHE_ENABLED = True
    # HTTPCACHE_EXPIRATION_SECS = 0
    # HTTPCACHE_DIR = 'httpcache'
    # HTTPCACHE_IGNORE_HTTP_CODES = []
    # HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
    
    

    7、middlewares.py 编写中间件

    # Define here the models for your spider middleware
    #
    # See documentation in:
    # https://docs.scrapy.org/en/latest/topics/spider-middleware.html
    
    from scrapy import signals
    import random
    # useful for handling different item types with a single interface
    # from itemadapter import is_item, ItemAdapter
    
    
    class DoubanmovieSpiderMiddleware:
        # Not all methods need to be defined. If a method is not defined,
        # scrapy acts as if the spider middleware does not modify the
        # passed objects.
    
        @classmethod
        def from_crawler(cls, crawler):
            # This method is used by Scrapy to create your spiders.
            s = cls()
            crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
            return s
    
        def process_spider_input(self, response, spider):
            # Called for each response that goes through the spider
            # middleware and into the spider.
    
            # Should return None or raise an exception.
            return None
    
        def process_spider_output(self, response, result, spider):
            # Called with the results returned from the Spider, after
            # it has processed the response.
    
            # Must return an iterable of Request, or item objects.
            for i in result:
                yield i
    
        def process_spider_exception(self, response, exception, spider):
            # Called when a spider or process_spider_input() method
            # (from other spider middleware) raises an exception.
    
            # Should return either None or an iterable of Request or item objects.
            pass
    
        def process_start_requests(self, start_requests, spider):
            # Called with the start requests of the spider, and works
            # similarly to the process_spider_output() method, except
            # that it doesn’t have a response associated.
    
            # Must return only requests (not items).
            for r in start_requests:
                yield r
    
        def spider_opened(self, spider):
            spider.logger.info('Spider opened: %s' % spider.name)
    
    
    class DoubanmovieDownloaderMiddleware:
        # Not all methods need to be defined. If a method is not defined,
        # scrapy acts as if the downloader middleware does not modify the
        # passed objects.
    
        @classmethod
        def from_crawler(cls, crawler):
            # This method is used by Scrapy to create your spiders.
            s = cls()
            crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
            return s
    
        def process_request(self, request, spider):
            # Called for each request that goes through the downloader
            # middleware.
    
            # Must either:
            # - return None: continue processing this request
            # - or return a Response object
            # - or return a Request object
            # - or raise IgnoreRequest: process_exception() methods of
            #   installed downloader middleware will be called
            return None
    
        def process_response(self, request, response, spider):
            # Called with the response returned from the downloader.
    
            # Must either;
            # - return a Response object
            # - return a Request object
            # - or raise IgnoreRequest
            return response
    
        def process_exception(self, request, exception, spider):
            # Called when a download handler or a process_request()
            # (from other downloader middleware) raises an exception.
    
            # Must either:
            # - return None: continue processing this exception
            # - return a Response object: stops process_exception() chain
            # - return a Request object: stops process_exception() chain
            pass
    
        def spider_opened(self, spider):
            spider.logger.info('Spider opened: %s' % spider.name)
    
    class MyUserAgent(object):
        def process_request(self, request, spider):
            USER_AGENT_list = [
                'MSIE (MSIE 6.0; X11; Linux; i686) Opera 7.23',
                'Opera/9.20 (Macintosh; Intel Mac OS X; U; en)',
                'Opera/9.0 (Macintosh; PPC Mac OS X; U; en)',
                'iTunes/9.0.3 (Macintosh; U; Intel Mac OS X 10_6_2; en-ca)',
                'Mozilla/4.76 [en_jp] (X11; U; SunOS 5.8 sun4u)',
                'iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2)',
                'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:5.0) Gecko/20100101 Firefox/5.0',
                'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0',
                'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20120813 Firefox/16.0',
                'Mozilla/4.77 [en] (X11; I; IRIX;64 6.5 IP30)',
                'Mozilla/4.8 [en] (X11; U; SunOS; 5.7 sun4u)'
            ]
            UserAgent = random.choice(USER_AGENT_list)
            request.headers['User-Agent'] = UserAgent
    
    

    8、运行爬虫,打开cmd进入spiders文件,输入命令

    scrapy crawl doubanspider
    

    9、爬取结果
    在这里插入图片描述
    参考:
    1、https://blog.51cto.com/13389043/2348849
    2、https://www.jianshu.com/p/a6d3db78bbc9

    展开全文
  • scrapy框架

    2019-08-07 16:44:37
    Scrapy 框架介绍与简单案例 2018年01月09日 11:06:06 gxh_apologize 阅读数 1952 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GXH_APOLOGIZE/article/details/79010585 一、Scrapy...
  • Python爬虫5.1 — scrapy框架简单入门

    千次阅读 2019-12-06 15:18:00
    Python爬虫5.1 — scrapy框架简单入门综述Scrapy 框架Scrapy 框架介绍Scrapy 架构图Scrapy 框架模块功能Scrapy 执行流程Scrapy 安装和文档Scrapy 快速入门创建项目创建爬虫目录介绍使用Scrapy框架爬取糗事百科使用...
  • scrapy框架简介 Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。(引用自:百度百科) scrapy...
  • Scrapy 框架

    2019-10-31 09:25:16
    八、Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片...
  • Scrapy框架初级

    2021-05-29 20:56:10
    Scrapy框架初级 Scrapy介绍 什么是scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取 Scrapy使用了Twisted异步网络框架,可以加快我们的下载速度...
  • scrapy框架解析

    2018-09-27 22:49:47
    1 Scrapy框架 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 2 Scrapy框架图 Scrapy数据流是由执行的核心引擎(engine)控制,...
  • 一、Scrapy框架简介Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的,...
  • scrapy框架基础

    2019-11-29 15:35:23
    scrapy框架基础 一、Scrapy Shell 1.简介 Scrapy Shell是用来调试Scrapy项目代码的命令行工具,启动的时候预定义了Scrapy的一些对象 Scrapy Shell的作用:调试 2.设置 Scrapy 的shell是基于运行环境中的python 解释...
  • 一、关于scrapy中pipleline的基本认识 Item Pipeline又称之为管道,顾名思义就是对数据的过滤处理,其主要的作用包括如下: 清理HTML数据。 验证爬取数据,检查爬取字段。 查重并丢弃重复内容。 将爬取结果保存到...
  • scrapy框架简笔

    2020-08-14 09:36:17
    目录)0x00 Scrapy简介0x01 Scrapy框架结构0x02 Scrapy安装0x03 Scrapy项目部署1. 创建项目和爬虫2. 修改settings.py配置文件0x04 创建运行文件run.py0x05 Pipelines.py1. 去重2. 修改形式3. 开启和关闭spider4. 以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,856
精华内容 3,142
关键字:

scrapy框架中文文档