1. 持久化
        目前缺点:
            - 无法完成爬虫刚开始:打开连接; 爬虫关闭时:关闭连接;
            - 分工明确
        pipeline/items
            a. 先写pipeline类
                class XXXPipeline(object):
                    def process_item(self, item, spider):
                        return item
                        
            b. 写Item类
                class XdbItem(scrapy.Item):
                    href = scrapy.Field()
                    title = scrapy.Field()
                            
            c. 配置
                ITEM_PIPELINES = {
                   'xdb.pipelines.XdbPipeline': 300,
                }
            
            d. 爬虫,yield每执行一次,process_item就调用一次。
                
                yield Item对象
        
        编写pipeline:
            from scrapy.exceptions import DropItem

class FilePipeline(object):

def __init__(self,path):
                    self.f = None
                    self.path = path

@classmethod
                def from_crawler(cls, crawler):
                    """
                    初始化时候,用于创建pipeline对象
                    :param crawler:
                    :return:
                    """
                    print('File.from_crawler')
                    path = crawler.settings.get('HREF_FILE_PATH')
                    return cls(path)

def open_spider(self,spider):
                    """
                    爬虫开始执行时,调用
                    :param spider:
                    :return:
                    """
                    print('File.open_spider')
                    self.f = open(self.path,'a+')

def process_item(self, item, spider):
                    # f = open('xx.log','a+')
                    # f.write(item['href']+'\n')
                    # f.close()
                    print('File',item['href'])
                    self.f.write(item['href']+'\n')
                    
                    # return item      # 交给下一个pipeline的process_item方法
                    raise DropItem()# 后续的 pipeline的process_item方法不再执行

def close_spider(self,spider):
                    """
                    爬虫关闭时,被调用
                    :param spider:
                    :return:
                    """
                    print('File.close_spider')
                    self.f.close()

注意:pipeline是所有爬虫公用,如果想要给某个爬虫定制需要使用spider参数自己进行处理。
        
    
2. 去重规则
    
    
    a. 编写类
        from scrapy.dupefilter import BaseDupeFilter
        from scrapy.utils.request import request_fingerprint

class XdbDupeFilter(BaseDupeFilter):

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

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

def request_seen(self, 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
                print('开始')

def close(self, reason):  # can return a deferred
                print('结束')

# def log(self, request, spider):  # log that a request has been filtered
            #     print('日志')

b. 配置
        # 修改默认的去重规则
        # DUPEFILTER_CLASS = 'scrapy.dupefilter.RFPDupeFilter'
        DUPEFILTER_CLASS = 'xdb.dupefilters.XdbDupeFilter'

c. 爬虫使用:
        class ChoutiSpider(scrapy.Spider):
            name = 'chouti'
            allowed_domains = ['chouti.com']
            start_urls = ['https://dig.chouti.com/']

def parse(self, response):
                print(response.request.url)
                # item_list = response.xpath('//div[@id="content-list"]/div[@class="item"]')
                # for item in item_list:
                #     text = item.xpath('.//a/text()').extract_first()
                #     href = item.xpath('.//a/@href').extract_first()

page_list = response.xpath('//div[@id="dig_lcpage"]//a/@href').extract()
                for page in page_list:
                    from scrapy.http import Request
                    page = "https://dig.chouti.com" + page
                    # yield Request(url=page,callback=self.parse,dont_filter=False) # https://dig.chouti.com/all/hot/recent/2
                    yield Request(url=page,callback=self.parse,dont_filter=True) # https://dig.chouti.com/all/hot/recent/2
    
    注意:
        - request_seen中编写正确逻辑
        - dont_filter=False

3. 深度
    配置文件:
        # 限制深度
        DEPTH_LIMIT = 3

4. cookie
    方式一:
        - 携带
            Request(
                url='https://dig.chouti.com/login',
                method='POST',
                body="phone=8613121758648&password=woshiniba&oneMonth=1",# # body=urlencode({})"phone=8615131255555&password=12sdf32sdf&oneMonth=1"
                cookies=self.cookie_dict,
                headers={
                    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                },
                callback=self.check_login
            )
        
        - 解析:
                from scrapy.http.cookies import CookieJar
                cookie_dict
                cookie_jar = CookieJar()
                cookie_jar.extract_cookies(response, response.request)

# 去对象中将cookie解析到字典
                for k, v in cookie_jar._cookies.items():
                    for i, j in v.items():
                        for m, n in j.items():
                            cookie_dict[m] = n.value
    方式二:meta

转载于:https://www.cnblogs.com/l-jie-n/p/10022406.html

Scrapy框架(持久化,去重,深度控制,cookie)相关推荐

  1. 爬虫Spider 08 - chromedriver设置无界面模式 | selenium - 键盘操作 | 鼠标操作 | 切换页面 | iframe子框架 | scrapy框架

    文章目录 Spider 07回顾 cookie模拟登陆 三个池子 selenium+phantomjs/chrome/firefox Spider 08 笔记 chromedriver设置无界面模式 ...

  2. 1月17日学习内容整理:Scrapy框架补充之pipeline,去重规则

    @@@老师博客::: 关于高性能和scrapy框架 http://www.cnblogs.com/wupeiqi/articles/6229292.html 关于scrapy-reids组件 http ...

  3. dataObject可以去重吗java_python爬虫scrapy框架之增量式爬虫的示例代码

    scrapy框架之增量式爬虫 一 .增量式爬虫 什么时候使用增量式爬虫: 增量式爬虫:需求 当我们浏览一些网站会发现,某些网站定时的会在原有的基础上更新一些新的数据.如一些电影网站会实时更新最近热门的 ...

  4. python cookie池_Python爬虫scrapy框架Cookie池(微博Cookie池)的使用

    下载代码Cookie池(这里主要是微博登录,也可以自己配置置其他的站点网址) 下载代码GitHub:https://github.com/Python3WebSpider/CookiesPool 下载 ...

  5. 爬虫之scrapy框架的数据持久化存储/保存为scv,json文件

    文章目录 前情回顾 selenium+phantomjs/chrome/firefox execjs模块使用 今日笔记 scrapy框架 小试牛刀 猫眼电影案例 知识点汇总 数据持久化存储(MySQL ...

  6. Scrapy框架--使用cookie

    CookieMiddleware class scrapy.downloadermiddlewares.cookies.CookieMiddlewar 该中间件使得爬取需要cookie(例如使用ses ...

  7. 爬虫----Scrapy框架

    一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...

  8. 爬虫 第六讲 Scrapy框架

    文章目录 爬虫 第六讲 Scrapy框架 一.Scrapy框架 Scrapy简介 工作流程 Scrapy入门 pipline使用 1.scrapy.Request知识点 2.item的介绍和使用 3. ...

  9. scrapy框架讲解

    简介: Scrapy是一个基于Python的开源异步爬虫框架,它被广泛用于从网页或App中,提取数据并将其保存到本地或数据库.由2.8版本以后提供了 http2.0协议的爬虫支持. 扩展: scrap ...

最新文章

  1. 2022-2028年中国美瞳行业应用市场需求及开拓机会研究报告
  2. 伊利诺伊大学厄巴纳-香槟分校
  3. 支持者基于BCH提出众多新概念,推动BCH创新
  4. android数据存放map_android - Java后台把数据用json发到手机端,里面是map存放的,必须要说明数据的类型?...
  5. Oracle SQL Access Advisor 说明
  6. 表单php跳转页面跳转,form表单页面跳转方式提交练习
  7. datagrip 导出数据库备份到本地
  8. FFT变换频谱图中频率刻度的设置方法
  9. python 自动打开登陆应用编码_Python+tkinter模拟“记住我”自动登录实例代码
  10. android 动态修改pdf,PDF编辑器安卓版,手机也能修改PDF文档
  11. 服装进销存软件哪个好?十大优质服装进销存管理软件排名
  12. TSL SSL SSH Openssl Openssh 区别
  13. Redis+Zookeeper+NIO+JVM+Dubbo+mq+Kafka+ElasticSearch+POI相关面试题
  14. matlab怎么画map图,用MATLAB自带的worldmap及相关函数画地图
  15. gtx1660是什么级别的_GTX1660显卡性能怎么样 gtx1660相当于什么显卡
  16. keytool 错误: java.lang.Exception: 密钥库文件不存在: keystore
  17. WIN7中文专业版安装日文语言包的方法
  18. Scons编译IMGUI
  19. TX-LCN分布式事务原理介绍
  20. NFS导致df -h卡主解决

热门文章

  1. 桌面 NAS 是什么
  2. 假如你有20万用来创业,你最想进入什么行业?
  3. 如果人生只剩最后一天,你想在这天干什么?
  4. 在承德避暑山庄里待过,给你的最大感受是什么?
  5. 目不给视的拼音及解释
  6. “做实体店,已经是绝路了吗?”
  7. 个人风格就是一种品牌
  8. 创业过程中一定会引进纯资金投资人
  9. 家庭网络,怎么给每个房间装一个无线路由器?
  10. In addition, Microsoft is also developing