Skip to content

newbie-hue/scrapy-and-scrapy_redis

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

scrapy

scrapy/scrapy_redis...

'''

1、scrapy_spider

腾信视频       
			多线程、日志  等基本的使用方式
糗事百科  
		1、持久化存储
			mysql/mongdb/本地
			数据的清洗  re.sub()   \ .strip()   \"".join()  lambda  strip()  join()
				import re
				ex_list = ['\3','\3',' ','mklmlkm']
				a = filter(lambda x:re.sub("\3",'',x).strip(),ex_list)
				print("".join(list(a)))

		2、随机的ua
			request.headers["User_Agent"] = ''
		3、代理
			request.meta['proxy'] = ''
		4、cookies的登录:(cookie放到headers中不能自己构造的cookie,但是可以使用settings中的cookies)
			request(cookies放入headers,cookies作为参数、session、selenium)
			1、start_request中的yield scrapy.Request(......cookies=cookies)  //COOKIES_ENABLED = True
			2、headers  settings中的设置
		5、post请求
			1、源码网页中有form表单,那么可以
				scrapy.FormRequest.form_response(.....formdata={账号的name标签:账号。密码的name标签:密码})
				不常用
			2、直接构造表单。
				post_data   在scrapy.FormRequest(.....formdata=post_data)
			3、scrapy.Request(url,method = 'POST',body=post_data)
		6、爬虫的去重 在当前的爬虫会进行去重)

2、crawlspider 的使用

创建
    circ文件的
    scrapy startproject 项目名
    cd 项目名
    scrapy genspider -t crawl 爬虫名 域名

CrawlSpider  circ因为网站的关闭,现在呈现的为逻辑

rule 链接提取器(会自动的补全不完整的href)  (正则或者xpath提取)
        allow(正则)满足的被抓取
        deny(正则 ) 满足的不被抓取
        allow_domains:响应会被提取的域名
        deny_domains:不会被提取的域名
        restrict_xpaths:和allow共同作用,满足的会被提取

    callback
        这个链接的解析函数
    folow 默认为False
        提取之后的链接进行请求,是否还进行同样的提取
    process_links:
        指定该spider中的哪个函数会被调用,
		从link_extractor中获取到链接列表的时候会调用该函数(只要用来过滤url和去重)
    process_request:
        指定该spider中的哪个函数会被调用,
		该规则提取到每个request的时候都会调用该函数。(用来过滤resuest)

注意点:
    通过 -t crawl进行创建
    不能重写paser函数

3、异步的协程框架注意点:suning_book

1、内存共享问题    在爬取suning_book的时候,有大分类、小分类、页面详情    
					在传递item的时候  因为是异步的框架前面的会改变item里面的内容,
					其实也就是说item传递的是spider中对应的内容   但是被改变了  
					如果想实现对应,那么就将其进行deepcopy
2、js生成的问题   通过js解决
3、ajax  抓包分析

4、scrapy_redis

    强大的地方    1、request去重  帮助持久化的去重   实现增量式爬虫
                2、爬虫持久化
                3、轻松实现分布式
                4、断点续爬?
    redis的复习
            cd  进入redis
            redis-server stop  ------>redis停止
            redis-server.exe redis.windows.conf   --->开启
            cmd  redis-cli  (本机)进入
                redis-cli -h<hostname> -p<port> 远程连接


            list
                lpush key value  左边添加
                lrange key start stop 返回所有值
                llen key   返回长度
            set
                sadd  key value   set添加数据
                smembers  key  获取所有数据
                scard  key 获取长度
            zset
                zadd key score value  添加
                zrange  key start stop (withscores)获取元素
                zcard  key

            清空数据库   flushdb
    scrapy_redis
        setting
                REDIS_URL = "redis://127.0.0.1:6379"
                or
                REDIS_HOST = '127.0.0.1'
                REDIS_PORT = '6379'
        源码解读(scrapy_redis)
            piplines  
				进行持久化储存的地方 _process_item
            dupefilter  
					通过request特征去重生成指纹
					默认通过sha1 request.method\request.url\request.body or b''\(include_headers)
					request_fingerprint
            scheduler
                    close方法   
						如果不持久化存储的话,爬虫停止时就清空指纹等内容
                    enqueue_request方法  
						如果not request.dont_filter and self.df.request_seen(request) 就不如队列
						否则就 进入队列
						或者  在Request对象中设置   dont_filter  = True ,那么就不会请求去重(用于更新)
						和scrapy的相同   url在start_url的时候,不管之前是否存在,都会入队。
                    使用sadd添加指纹 根据返回值来判断是否入队。

    可以由scrapy改造而来
        加上

            #去重的类
            DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
            #调度器
            SCHEDULER = "scrapy_redis.scheduler.Scheduler"
            #调度器是否持久化存储
            SCHEDULER_PERSIST = True

            ITEM_PIPELINES = {
                #数据清洗
                'example.pipelines.ExamplePipeline': 300,
                #redis数据储存(是否在数据库中的item进行存储)
                'scrapy_redis.pipelines.RedisPipeline': 400,
            }
            REDIS_URL = "redis://127.0.0.1:6379"

5、分布式爬虫

    1、spider
        1、allowed_domains  的问题。因为是从scrapy中建立起来的,所以就没有
            def __init__(self)
            pass
            的初始化方法
            而是使用allowed_domains来进行使用。
        2、spider继承的类是RedisSoider,所以
            1、from scrapy_redis.spider import RedisSpider
            2、将继承的类更改为   RedisSpider
        3、start_url储存在redis中,所以
            把start_url 更改为
            redis_key = 'dangdang'  (读取这个键里面的url作为起始的url)
        4、在redis中插入  起始的url 对应的键值对  ----以列表的形式  lpush
        5、加入scrapy_redis中 setting 添加的内容
        6、更换rREDIS_URL 为本机的真实IP
    2、crawlspider
        1、继承的父类是RedisCrawlSpider

1、断点续爬的实现原理 2、增量爬虫的实现原理

'''

About

scrapy/scrapy_redis...

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published