python - scrapy 爬虫框架(创建, 持久化, 去重, 深度, cookie)

## scrapy 依赖 twisted
  - twisted 是一个基于事件循环的 异步非阻塞 框架/模块

##  项目的创建 

1. 创建 project
    scrapy  startproject  项目名称

    项目名称(项目结构)
        - spiders    # 爬虫文件
            - q.py
            - w.py
        - items.py         # 持久化
        - pipelines         # 持久化
        - middlewares.py   # 中间件
        - settings.py    # 配置文件(爬虫)
    scrapy.cfg    # 配置文件(部署)

2. 创建爬虫
    cd 项目名称

    scrapy genspider  q  q.com
    scrapy genspider  w  w.com

3. 启动爬虫
    scrapy crawl  q --nolog   # 不查看日志
    scrapy crawl  w              # 默认查看日志

## pipeline 做持久化

    - pipeline 是所有爬虫公用的,如果想要给某个爬虫制定需要使用 spider 参数进行判断处理:
      if spider.name == ‘xxx‘

1. 自定义的爬虫文件中 将每次获取到的数据 传给 ScrapyDeom1Item 类方法
for item in item_list:
    href = item.xpath(‘.//a/@href‘).extract_first()
    txt = item.xpath(‘.//a/text()‘).extract_first()
    yield ScrapyDeom1Item(text=txt, href=href)

2. items 中 ScrapyDeom1Item 类方法 将需要存储的数据接收到。
class ScrapyDeom1Item(scrapy.Item):
    href = scrapy.Field()
    text = scrapy.Field()

3. settings 中定义做持久化的类( ScrapyDeom1Pipeline ) 和 定义一个文件路径
ITEM_PIPELINES = {
   ‘scrapy_deom1.pipelines.ScrapyDeom1Pipeline‘: 300,
       # 文件路径                       # 优先级( 1-1000 )
}
PATH = ‘new.log‘

4. 到 pipelines.py 文件中 找到 ScrapyDeom1Pipeline 类并做持久化
from scrapy.exceptions import DropItem
class ScrapyDeom1Pipeline(object):

    def __init__(self, path):  # 初始化定义文件操作 和 文件要保存的路径
        self.f = None
        self.path = path

    @classmethod
    def from_crawler(cls, crawler):
        """
        初始化的时候,用来创建 pipeline 对象
        :param crawler:
        :return:
        """
        # 去settings 寻找要保存的文件路径
        path = crawler.settings.get(‘PATH‘)
        return cls(path)

    def open_spider(self, spider):
        """
        爬虫刚启动时调用 - 此处用来做打开文件操作
        :param spider:
        :return:
        """
        self.f = open(self.path, ‘a+‘)

    def process_item(self, item, spider):
        """
        爬虫执行中调用 - 此处用来做将数据写入文件 操作
        :param item:
        :param spider:
        :return:
        """
        self.f.write(item[‘href‘]+‘\n‘)
        # raise DropItem()   # 抛出异常,使后续的 pipeline 的 process_item 方法不执行
        return item    # 这个 item 是要返回给下个类的

    def close_spider(self, spider):
        """
        爬虫执行完毕后调用 - 此处用来做关闭文件操作
        :param spider:
        :return:
        """
        self.f.close()

## 去重

1. 创建一个 dupefilters.py 文件(用于做去重操作):
from scrapy.dupefilters import BaseDupeFilter
from scrapy.utils.request import request_fingerprint

class MyDupeFilter(BaseDupeFilter):

    def __init__(self):
        self.visited_fd = set()

    @classmethod
    def from_settings(cls, settings):
        return cls()

    def request_seen(self, request):
        """
        判断当前请求的URL是否存在 - 用于去重
            - 如果存在则  pass
            - 如不存在则  添加
        :param request:
        :return:
        """
        # 将当前 URL 加密成一定位数的字符
        print(request)
        fd = request_fingerprint(request=request)
        if fd in self.visited_fd:
            return True
        self.visited_fd.add(fd)

    def open(self):  # can return deferred
        """
        执行前的一些操作
        :return:
        """
        print(‘爬虫开始‘)

    def close(self, reason):  # can return a deferred
        """
        执行结束后的一些操作
        :param reason:
        :return:
        """
        print(‘爬虫结束‘)

    def log(self, request, spider):  # log that a request has been filtered
        """
        访问的每一个  URL  的日志信息
        :param request:
        :param spider:
        :return:
        """
        pass

2. settings 中注册这个类
DUPEFILTER_CLASS = ‘scrapy_demo1.dupefilters.MyDupeFilter‘

3. 可以设置是否使用当前定义的去重方法
# True 表示不使用
# False 表示使用 (默认为False)
yield Request(url=page, callback=self.parse, dont_filter=True)

##  限制深度查询

配置文件中(settings):
DEPTH_LIMIT = 3  # 查询深度设置为三层

##  Cookie

from scrapy.http.cookies import CookieJar
cookie_dict = {}
# 去对象中将cookie解析到字典
        for k, v in cookie_jar._cookies.items():
            for i, j in v.items():
                for m, n in j.items():
                    self.cookie_dict[m] = n.value

原文地址:https://www.cnblogs.com/chaoqi/p/10545034.html

时间: 2024-11-05 19:30:20

python - scrapy 爬虫框架(创建, 持久化, 去重, 深度, cookie)的相关文章

Python Scrapy爬虫框架安装、配置及实践

近期研究业界安卓APP主要漏洞类型.wooyun算是国内最有名的漏洞报告平台,总结一下这上面的漏洞数据对后面测试与分析漏洞趋势有指导意义,因此写一个爬虫. 不再造轮子了,使用Python的Scrapy框架实现之. 一.安装 64位系统安装时,一定要注意Python的位数与Scrapy及其依赖库位数一致.否则各种坑爹Bug 安装32位Python 2.7 下载并安装pip(方便自动安装管理依赖库) https://pypi.python.org/pypi/pip/7.1.2 下载源码,python

Python Scrapy爬虫框架之初次使用

本案例来自小甲鱼的课程 关于Scrapy的安装网上都有方法,这里便不再叙述. 使用Scrapy抓取一个网站一共需要四个步骤: 0.创建一个Scrapy项目: 1.定义Item容器: 2.编写爬虫: 3.存储内容. 本次爬取的目标是全球最大的目录网站http://www.dmoztools.net,由于此网站数据过于庞大,我们这里只拿它的两个子网页做测试(手动捂脸) http://www.dmoztools.net/Computers/Programming/Languages/Python/Bo

Python之Scrapy爬虫框架安装及简单使用

题记:早已听闻python爬虫框架的大名.近些天学习了下其中的Scrapy爬虫框架,将自己理解的跟大家分享.有表述不当之处,望大神们斧正. 一.初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫. 本文档将

Python爬虫教程-31-创建 Scrapy 爬虫框架项目

本篇是介绍在 Anaconda 环境下,创建 Scrapy 爬虫框架项目的步骤,且介绍比较详细 Python爬虫教程-31-创建 Scrapy 爬虫框架项目 首先说一下,本篇是在 Anaconda 环境下,所以如果没有安装 Anaconda 请先到官网下载安装 Anaconda 下载地址:https://www.anaconda.com/download/ Scrapy 爬虫框架项目的创建 0.打开[cmd] 1.进入你要使用的 Anaconda 环境 1.环境名可以在[Pycharm]的[Se

一个咸鱼的python爬虫之路(五):scrapy 爬虫框架

介绍一下scrapy 爬虫框架 安装方法 pip install scrapy 就可以实现安装了.我自己用anaconda 命令为conda install scrapy. 1 Engine从Spider处获得爬取请求(Request)2Engine将爬取请求转发给Scheduler,用于调度 3 Engine从Scheduler处获得下一个要爬取的请求4 Engine将爬取请求通过中间件发送给Downloader5 爬取网页后,Downloader形成响应(Response)通过中间件发给En

Python Scrapy爬虫(上)

Python Scrapy爬虫 预备知识: 1.Scrapy框架:是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架. 2.Scrapy去重原理:Scrapy本身自带有一个中间件.scrapy源码中可以找到一个dupefilters.py去重器,需要将dont_filter设置为False开启去重,默认是True,没有开启去重. 3.指纹去重:对于每一个URL的请求,调度器都会根据请求得相关信息加密得到一个指纹信息,并且将该URL的指纹信息和set()集合中的指纹信息进行

Scrapy爬虫框架第一讲(Linux环境)

1.What is Scrapy? 答:Scrapy是一个使用python语言(基于Twistec框架)编写的开源网络爬虫框架,其结构清晰.模块之间的耦合程度低,具有较强的扩张性,能满足各种需求.(前面我们介绍了使用requests.beautifulsoup.selenium等相当于你写作文题,主要针对的是个人爬虫:而Scrapy框架的出现给了我们一个方便灵活爬虫程序架构,我们只需针对其中的组件做更改,即可实现一个完美的网络爬虫,相当于你做填空题!) 基于Scrapy的使用方便性,下面所有的S

手把手教你如何新建scrapy爬虫框架的第一个项目(下)

前几天小编带大家学会了如何在Scrapy框架下创建属于自己的第一个爬虫项目(上),今天我们进一步深入的了解Scrapy爬虫项目创建,这里以伯乐在线网站的所有文章页为例进行说明. 在我们创建好Scrapy爬虫项目之后,会得到上图中的提示,大意是让我们直接根据模板进行创建Scrapy项目.根据提示,我们首先运行"cd article"命令,意思是打开或者进入到article文件夹下,尔后执行命令"scrapy genspider jobbole blog.jobbole.com&

Scrapy爬虫框架的使用

#_author:来童星#date:2019/12/24# Scrapy爬虫框架的使用#1.安装Twisted模块 https://www.lfd.uci.edu/~gohlke/pythonlibs/#2.单击Twisted索引import scrapyfrom scrapy.crawler import CrawlerProcess# 导入获取项目设置信息from scrapy.utils.project import get_project_settingsclass QuotesSpid