Python 在scrapy downolader中间件中使用正则表达式
我一直在尝试用Scrapy制作一个自定义中间件,它将使用regex标记包含特定模式的URL。简而言之,这里有一个异常列表,每个url都会根据它进行检查。但是,中间件无法正确识别异常(它总是为re.match()返回无结果) 我已经尝试在一个单独的脚本中实现regex,而且效果很好。我真的很想知道为什么会发生这种情况 以下是示例情况: 1) 蜘蛛 2) 设置: 3) 我的中间件(即middleware.py中的新类): 。 . 4) 这是我的记录器识别的一个示例: * 在中找不到https://www.amazon.co.uk/gp/help/customer/display.html/ref=footer_cookies_notice?ie=UTF8&nodeId=201890250> *您的代码确实有效,您正在尝试匹配Python 在scrapy downolader中间件中使用正则表达式,python,regex,python-3.x,scrapy,scrapy-middleware,Python,Regex,Python 3.x,Scrapy,Scrapy Middleware,我一直在尝试用Scrapy制作一个自定义中间件,它将使用regex标记包含特定模式的URL。简而言之,这里有一个异常列表,每个url都会根据它进行检查。但是,中间件无法正确识别异常(它总是为re.match()返回无结果) 我已经尝试在一个单独的脚本中实现regex,而且效果很好。我真的很想知道为什么会发生这种情况 以下是示例情况: 1) 蜘蛛 2) 设置: 3) 我的中间件(即middleware.py中的新类): 。 . 4) 这是我的记录器识别的一个示例: * 在中找不到https://
有声有声读物下载
,它会为您问题中的url返回无
,因为它不存在,这就是您看到的。然后检查url中是否存在help
,它确实存在并且已经打印了该url
在下面的代码中,我检查m
是否不是None
,然后打印完全匹配
import logging
import re
exceptions = ['Audible-Audiobook-Downloads','help']
for i in exceptions:
pattern = re.compile(r'[a-z0-9.:/-]+/{}/[0-9a-z.:/-]+'.format(re.escape(i)))
m = pattern.match("https://www.amazon.co.uk/gp/help/customer/display.html/ref=footer_cookies_notice?ie=UTF8&nodeId=201890250")
if m:
print(m.group(0))
嗨,马克,谢谢你的建议。这就是问题所在,当我在一个单独的脚本中检查regex时,就像您提供的脚本一样,一切都很好。但当我在中间件中实现它时,问题就出现了。我是否在引用请求url的方式上犯了错误?此外,我正在使用Python 3.7,但也尝试运行3.5.3中的代码(将f“”更改为.format()),但结果是相同的。
BOT_NAME = 'foo'
SPIDER_MODULES = ['foo.spiders']
NEWSPIDER_MODULE = 'foo.spiders'
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0'
ROBOTSTXT_OBEY = False
DOWNLOADER_MIDDLEWARES = {
'foo.middlewares.FooDownloaderMiddleware': 543,
'foo.middlewares.TryMiddleware':500,
}
import logging
import re
class TryMiddleware(object):
def __init__(self):
self.items_scraped = 0
self.target = ''
self.exceptions = []
@classmethod
def from_crawler(cls, crawler):
s = cls()
return s
def process_request(self, request, spider):
self.target = str(request)
# Just an example, at a later stage, these will be dynamically generated.
self.exceptions = ['Audible-Audiobook-Downloads','help']
for i in self.exceptions:
pattern = re.compile(r'[a-z0-9.:/-]+/{}/[0-9a-z.:/-]+'.format(re.escape(i)))
if i in self.target:
m = pattern.match(self.target)
# This is how I tried checking if the word is contained in the url,
# and see if regex caught it.
logger.info(f'\n*\nFound {m} in {target}\n*\n')
return None
import logging
import re
exceptions = ['Audible-Audiobook-Downloads','help']
for i in exceptions:
pattern = re.compile(r'[a-z0-9.:/-]+/{}/[0-9a-z.:/-]+'.format(re.escape(i)))
m = pattern.match("https://www.amazon.co.uk/gp/help/customer/display.html/ref=footer_cookies_notice?ie=UTF8&nodeId=201890250")
if m:
print(m.group(0))