在Python 3.6中,我的CrawlSpider(Linkextractor中的Rule)有一个小问题。目前,我正在编写用于从路透社网站下载文章的代码。
借助一些软件包文档,书籍和其他在线资源,我能够为每个网站编写标题和文本的下载公式。不幸的是,我在过滤生成的URL时遇到问题。
使用以下代码,我从路透社生成所有可能的链接:
import scrapy
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
class ArticleSpider(CrawlSpider):
name = 'articles'
allowed_domains = ['reuters.com']`
start_urls = ['https://www.reuters.com/']
rules = [Rule(LinkExtractor(allow=r'.*'), callback='parse_items',
follow=True)]
一切都在这里正常工作。但是,我想将生成的URL限制为包含“文章”的URL:
我想在LinkExtractor / Rule中添加限制,即该限制只能使用带有/ article /短语的URL。我尝试使用各种选项来做到这一点,从最基本的选项开始,例如“允许并以if函数结束一些更复杂的操作。不幸的是,在每种情况下,spider都在几秒钟内完成,并且生成的链接很少。
我尝试了以下选项:
rules = [Rule(LinkExtractor(allow=r'article.*',),follow=True)]
rules = [Rule(LinkExtractor(allow='^(article)((?!:).)*$'), callback='parse_items', follow=True),]
rules = [Rule(LinkExtractor(allow='article.*',),follow=True)]
以及其他参数(is_article):
rules = [Rule(LinkExtractor(allow='^article.*'),
callback='parse_items', follow=True,
cb_kwargs={'is_article': True}),
Rule(LinkExtractor(allow='.*'), callback='parse_items',
cb_kwargs={'is_article': False})]
但这没有帮助。
当我生成没有任何限制的链接时,我会收到大量的链接,这些链接也包含在/ article /内部。我检查了一下,然后比较了URL的数量。我保存了所有生成的URL(无限制),导入到R中,仅选择了带有“文章”的URL。这个数字非常庞大,只有“文章”限制的蜘蛛会在几秒钟后完成:/因此,我得出结论认为一定有问题。
最有可能的是,我在某个地方犯了一个小错误,或者我只是不完全理解“ allow”功能。这是我第一次使用Python,因此,请您提供一些小的帮助和理解。对于所有提示,我将不胜感激。
谢谢!
致以诚挚的问候
自拍
P.S。
我不知道这是否重要,我在Windows和Anaconda 3-5.20上使用Python 3.6。