scrapy是一个优秀的python爬虫框架,它支持并发、分布式、异步等高级特性,可以帮助开发者更快、更稳定地爬取互联网上的数据。在scrapy中,链接提取器和去重工具是非常重要的组件,用来辅助爬虫完成自动化的数据抓取和处理。本文将对scrapy中的链接提取器和去重工具进行分析,探究它们是如何实现的,以及在scrapy爬取过程中的应用。
一、链接提取器的作用及实现 内容来自zvvq,别采集哟
链接提取器(Link Extractor)是Scrapy爬虫框架中的一个自动提取URL链接的工具。在一个完整的爬虫过程中,往往需要从网页中提取出一些URL链接,然后根据这些链接进一步进行访问和处理。链接提取器就是用来实现这个过程的,它可以根据一些规则从网页中自动提取出链接,并将这些链接保存到Scrapy的请求队列中等待后续处理。
在Scrapy中,链接提取器是通过正则表达式或XPath表达式来进行匹配的。Scrapy提供了两个链接提取器:基于正则表达式的LinkExtractor和基于XPath表达式的LxmlLinkExtractor。 内容来自zvvq,别采集哟
基于正则表达式的LinkExtractor基于正则表达式的LinkExtractor可以通过对网页中的URL进行正则匹配,自动提取出匹配成功的链接。例如,我们希望从一个网页中提取所有以 http://example.com/ 开头的链接,可以使用以下代码: 内容来自samhan666
1 本文来自zvvq
2
3 内容来自samhan666
4
copyright zvvq
from scrapy.linkextractors import LinkExtractor
本文来自zvvq
link_extractor = LinkExtractor(allow=r^http://example.com/) 内容来自zvvq,别采集哟
links = link_extractor.extract_links(response)
内容来自zvvq
allow参数指定了一个正则表达式,用来匹配所有以 http://example.com/ 开头的链接。extract_links()方法可以提取出所有匹配成功的链接,保存在一个Link对象列表中。
Link对象是Scrapy框架中用来表示链接的数据结构,其中包含了链接的URL、标题、anchor文本和链接的类型等信息。通过这些对象,我们可以很方便地获取到需要的链接,并在Scrapy爬虫中进一步处理和访问。 内容来自samhan
基于XPath表达式的LxmlLinkExtractor基于XPath表达式的LxmlLinkExtractor可以通过对网页中的HTML标签进行XPath表达式匹配,自动提取出匹配成功的链接。例如,我们希望从一个网页中提取所有class属性等于 "storylink" 的a链接,可以使用以下代码: 内容来自zvvq
1 内容来自zvvq,别采集哟
2 zvvq.cn
3 zvvq.cn
4
from scrapy.linkextractors import LxmlLinkExtractor 内容来自zvvq
link_extractor = LxmlLinkExtractor(restrict_xpaths=//a[@class="storylink"]) 内容来自samhan
links = link_extractor.extract_links(response)
内容来自samhan666
restrict_xpaths参数指定了一个XPath表达式,用来匹配所有class属性等于 "storylink" 的a标签。LxmlLinkExtractor的使用方式和LinkExtractor类似,可以将提取到的链接保存在一个Link对象列表中。需要注意的是,由于LxmlLinkExtractor使用了lxml库进行HTML解析,因此需要在项目的配置文件中添加以下代码: 内容来自zvvq
1
zvvq好,好zvvq
2
3 zvvq好,好zvvq
4
# settings.py 本文来自zvvq
DOWNLOAD_HANDLERS = {
s3: None, zvvq
}
zvvq好,好zvvq
以上代码可以禁用Scrapy中默认的下载器,从而使用lxml库的HTML解析器。
copyright zvvq
二、去重工具的作用及实现
在进行Web爬取时,链接去重是非常重要的,因为在大多数情况下,同一个网页的不同链接是会重复出现的,如果不去重,就会造成重复爬取的问题,浪费带宽和时间。因此,在Scrapy中引入了去重工具(Duplicate Filter),用来对已经爬取过的链接进行标记和判断,避免重复访问。 内容来自zvvq
去重工具的原理是通过将已经访问过的URL链接保存到一个数据结构中,然后对新的URL链接进行判断是否已经访问过,如果访问过,则将该URL链接丢弃,否则将其加入到爬虫的请求队列中。Scrapy中内置了很多种去重工具,包括基于内存的Set类去重器、基于磁盘的SQLite3去重器以及基于Redis的去重器等。不同的去重器有不同的适用场景,下面我们以Redis去重器为例进行说明。
本文来自zvvq
基于Redis的去重器Redis是一款高性能的NoSQL内存数据库,可以支持分布式、持久化、数据结构丰富等高级特性,非常适合用来实现Scrapy的去重工具。Scrapy中的Redis去重器可以通过对已经访问过的URL链接进行标记,避免重复访问。 内容来自samhan666
Scrapy默认使用的是基于内存的Set类去重器,如果需要使用Redis去重器,可以在项目的配置文件中添加以下代码:
zvvq.cn
1
内容来自samhan666
2
3
内容来自samhan666
4 copyright zvvq
5
6 zvvq
# settings.py zvvq
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
zvvq好,好zvvq
SCHEDULER = "scrapy_redis.scheduler.Scheduler" zvvq.cn
SCHEDULER_PERSIST = True zvvq
REDIS_HOST = "localhost" zvvq.cn
REDIS_PORT = 6379 zvvq.cn
其中,DUPEFILTER_CLASS参数指定了去重工具使用的去重策略,此处我们使用的是scrapy_redis.dupefilter.RFPDupeFilter,该去重器是基于Redis的set数据结构实现的。 内容来自zvvq
SCHEDULER参数指定了调度器使用的调度策略,此处我们使用的是scrapy_redis.scheduler.Scheduler,该调度器是基于Redis的sorted set数据结构实现的。 zvvq
SCHEDULER_PERSIST参数指定了调度器是否需要在Redis中持久化,即是否需要保存上一次爬取的状态,从而避免重新爬取已经爬取过的URL。
REDIS_HOST和REDIS_PORT参数分别指定了Redis数据库的IP地址和端口号,如果Redis数据库不在本地,则需要设置相应的IP地址。 内容来自zvvq
使用Redis去重器之后,需要在爬虫中添加redis_key参数,用来指定Redis中保存URL链接的key名。例如: zvvq
1
内容来自samhan
2
内容来自samhan
3 zvvq.cn
4 内容来自samhan666
5
内容来自zvvq,别采集哟
6
7
8 本文来自zvvq
9
10
11
12 内容来自zvvq,别采集哟
13
本文来自zvvq
14
15 内容来自samhan
16
内容来自zvvq
17 本文来自zvvq
18 copyright zvvq
19 本文来自zvvq
20
内容来自zvvq
21
内容来自samhan
22
内容来自samhan
23 zvvq好,好zvvq
24 zvvq
25 内容来自zvvq,别采集哟
26
27 内容来自zvvq
28 zvvq.cn
29
30
31
zvvq好,好zvvq
32
33
内容来自zvvq
34
copyright zvvq
35 内容来自samhan666
36 zvvq
# spider.py 内容来自zvvq
class MySpider(scrapy.Spider):
name = myspider 内容来自zvvq
start_urls = [http://example.com]
custom_settings = { zvvq好,好zvvq
REDIS_HOST: localhost, zvvq.cn
REDIS_PORT: 6379, 内容来自samhan666
DUPEFILTER_CLASS: scrapy_redis.dupefilter.RFPDupeFilter,
SCHEDULER: scrapy_redis.scheduler.Scheduler,
copyright zvvq
SCHEDULER_PERSIST: True, 内容来自zvvq
SCHEDULER_QUEUE_CLASS: scrapy_redis.queue.SpiderPriorityQueue, 内容来自samhan666
REDIS_URL: redis://user:pass@localhost:6379, zvvq好,好zvvq
ITEM_PIPELINES: {
scrapy_redis.pipelines.RedisPipeline: 400, 内容来自samhan
}, 内容来自zvvq
DOWNLOADER_MIDDLEWARES: {
zvvq
scrapy.downloadermiddlewares.useragent.UserAgentMiddleware: None,
scrapy_useragents.downloadermiddlewares.useragents.UserAgentsMiddleware: 500, 内容来自samhan
},
FEED_URI: result.json, 内容来自samhan
FEED_FORMAT: json,
LOG_LEVEL: INFO, zvvq
SPIDER_MIDDLEWARES: { 内容来自samhan
scrapy.spidermiddlewares.httperror.HttpErrorMiddleware: 300,
内容来自samhan
}
}
内容来自zvvq,别采集哟
def __init__(self, *args, **kwargs):
内容来自samhan666
domain = kwargs.pop(domain, )
内容来自zvvq
self.allowed_domains = filter(None, domain.split(,))
copyright zvvq
self.redis_key = %s:start_urls % self.name zvvq好,好zvvq
super(MySpider, self).__init__(*args, **kwargs)
def parse(self, response): zvvq.cn
pass
以上是一个简单的爬虫示例,redis_key参数指定了在Redis中保存URL链接的键名为myspider:start_urls。在parse()方法中,需要编写自己的网页解析代码,提取出需要的信息。 内容来自samhan666
三、总结 copyright zvvq
链接提取器和去重工具是Scrapy爬虫框架中非常重要的组件,它们可以大大简化我们编写爬虫的工作,并提高爬虫的效率。在使用Scrapy爬虫时,我们可以根据自己的需求选择不同的链接提取器和去重工具,从而实现更为高效和灵活的爬虫功能。 内容来自samhan666
以上就是Scrapy中的链接提取器和去重工具分析的详细内容,更多请关注其它相关文章!
本文来自zvvq