不遵守Scrapy CrawlSpider规则?

时间:2018-12-31 15:58:43

标签: regex scrapy

我的小蜘蛛正在爬行论坛,但我不希望它爬行。

规则在json文件中:

#Current DataFrame
print(df)
Stock Ticker    Index Ticker    Price   Date
AAPL            INDX            100     12/31/2018 8:57  
GOOG            RSL             123     12/31/2018 8:57
GM              COMP            90      12/31/2018 8:57
MMM             NIKK            340     12/31/2018 8:57
INVD            EUR             30      12/31/2018 8:57 

#Desired results
print(df2)
Stock and Bench   Price   Date
AAPL              100     12/31/2018 8:57
INDX              100     12/31/2018 8:57
GOOG              123     12/31/2018 8:57
RSL               123     12/31/2018 8:57
GM                90      12/31/2018 8:57
COMP              90      12/31/2018 8:57
MMM               340     12/31/2018 8:57
NIKK              340     12/31/2018 8:57
INVD              30      12/31/2018 8:57
EUR               30      12/31/2018 8:57

我的蜘蛛正在加载json文件并解析规则。 allow和use_content在起作用,我的论坛规则似乎被忽略了。

"rules": [
{
    "allow": ["\\/topic\/.*"],
    "follow": true
},
{
    "allow": ["\\/tr\\/article\\/.*.html"],
    "follow": false,
    "use_content": true
},
{
    "deny": ["\/forum\/.*"],
    "follow": false
},

有很多:

  

2018-12-31 07:45:30 [scrapy.core.engine]调试:已爬网(200)https://www.example.com/forum/online/News -...

我认为我的正则表达式错误地避免了/ forum /网址? (尝试了多个 # add all rules from JSON file in a for loop: deny_r = () if "deny" in rule.keys(): deny_r = [d for d in rule["deny"]] Genspider.rules.append(Rule( LinkExtractor( allow=allow_r, deny=deny_r, restrict_xpaths=restrict_xpaths_r, ), follow=rule["follow"], callback='parse_item' if ("use_content" in rule.keys()) else None )) ,但似乎始终是同一个问题-尽管其他拒绝/关注错误似乎仍然有效)

1 个答案:

答案 0 :(得分:1)

您需要在所有规则中添加拒绝。为什么?

Rule documentation

中所述
  

rules:这是一个(或多个)Rule对象的列表。每个规则都定义了用于爬网的特定行为。规则对象如下所述。如果多个规则与同一链接匹配,则将按照在此属性中定义的顺序使用第一个规则。

因此,如果前两个规则中的任何一个适用于论坛URL,除非为其定义了拒绝条目,否则将遵循该规则。

您的规则JSON应该看起来像这样

"rules": [
{
    "deny": ["\/forum\/.*"],
    "allow": ["\\/topic\/.*"],
    "follow": true
},
{
    "deny": ["\/forum\/.*"],
    "allow": ["\\/tr\\/article\\/.*.html"],
    "follow": false,
    "use_content": true
}
]