CrawlSpider全网爬虫

8 篇文章 0 订阅
3 篇文章 0 订阅

CrawlSpider全网爬虫

CrawlSpider是继承了Spider的全站爬虫类。CrawlSpider类定义了一些规则(rule)来提供跟进提取出来的网址link的方便的机制,更适合从爬取的网页中获取新的link并继续爬取的工作。

产生一个crawlspider
scrapy genspider -t crawl 爬虫名
LinkExtractors(链接提取器)
  • 在响应中可以使用xpath,正则等方式提取链接,Scrapy也实现了链接提取的方式,这种方式就是链接提取器。链接提取器主要从网页的响应中提取跳转的链接。提取的是可点击跳转网页的链接
 rules = (
        Rule(LinkExtractor(allow=r'http://bang\.dangdang\.com/books/bestsellers/.*?'),
             callback='parse_item',
             follow=True)
    )
# callback , 回调函数
# follow ,是否继续追踪

LinkExtractor主要参数:
1 allow
接收一个正则表达式或一个正则表达式列表,提取绝对url与正则表达 式匹配的链接。如果该参数为空(默认),就提取全部链接。
2 deny
接收一个正在则表达式或一个正则表达式列表,与allow相反,排除绝 对url与正则表达式匹配的链接。
3 allow_domains
会被提取的链接的domains。相当于域名白名单。
4 deny_domains
一定不会被提取链接的domains。相当于域名黑名单。
5 restrict_xpaths
使用xpath表达式,和allow共同作用过滤链接。表示从当前页面中XPath匹配区域提取链接。这个值是XPath表达式或者是XPath表达式列表。

  • Rule对象是一个爬取规则的类

Rule参数解释:
1 link_extractor:
是一个Link Extractor对象。其定义了如何从爬取到的页面提取链接。
2 callback:
是一个callable或string(该Spider中同名的函数将会被调用)。从link_extractor 中每获取到链接时将会调用该函数。该回调函数接收一个response作为其第一个参数, 并返回一个包含Item以及Request对象(或者这两者的子类)的列表。
3 cb_kwargs:
包含传递给回调函数的参数(keyword argument)的字典。
4 follow:
是一个boolean值,指定了根据该规则从response提取的链接是否需要跟进。如果 callback为None,follow默认设置True,否则默认False。
5 process_links:
是一个callable或string(该Spider中同名的函数将会被调用)。从link_extrator中获 取到链接列表时将会调用该函数。该方法主要是用来过滤。
6 process_request:
是一个callable或string(该spider中同名的函数都将会被调用)。该规则提取到的每 个request时都会调用该函数。该函数必须返回一个request或者None。用来过滤 request。

指纹过滤器
  • 去重处理可以避免将重复性的数据保存到数据库中以造成大量的冗余性数据。不要在获得爬虫的结果后进行内容过滤,这样做只不过是避免后端数据库出现重复数据。
# 自定义指纹过滤器,将指纹存入redis中
from scrapy.utils.request import request_fingerprint
from scrapy.dupefilters import BaseDupeFilter
import redis


class Mydupefilters(BaseDupeFilter):
	
    # 初始化数据库
    def __init__(self, host, port, db, passwd):
        self.myredis = redis.StrictRedis(host=host, port=port,
                                         db=db, password=passwd)
	# 从settings中获取参数
    @classmethod
    def from_settings(cls, settings):
        return cls(
            host=settings["REDIS_HOST"],
            port=settings["REDIS_PORT"],
            db=settings["REDIS_DB"],
            passwd=settings["REDIS_PWD"]
        )
	# 保存到redis中,不要修改方法名
    def request_seen(self, request):
        fp = request_fingerprint(request)
        KEY = "key"
        if not self.myredis.sismember(KEY, fp):
            self.myredis.sadd(KEY, fp)
            return False
        return True

setting设置
# 激活指纹过滤器
DUPEFILTER_CLASS = 'tencentcrawlspider.mydupefilters.Mydupefilters'
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值