- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我传入一个 start_url
,它是新闻文章页面(例如 cnn.com )。但是,我只想提取新闻文章本身,我不想跟踪文章页面上的任何链接。为此,我使用 CrawlSpider
遵循以下规则:
rules = (
Rule(LinkExtractor(allow=('regexToMatchArticleUrls',),
deny=('someDenyUrls')), callback='parse_article_page'),
)
def parse_article_page(self,response):
#extracts the title, date, body, etc of article
我已启用 scrapy.spidermiddlewares.depth.DepthMiddleware
并设置DEPTH_LIMIT = 1
.
但是,我仍然从恰好与 regexToMatchArticleUrls
匹配的各个文章页面抓取链接,因为它们是指向同一网站其他部分的链接(并且我无法使正则表达式更限制)。
但是,为什么当 DEPTH_LIMIT=1
时这些链接会被抓取呢?是否因为从 LinkExtractor
提取的每个链接都会重置 DEPTH_LIMIT
,即。文章页面网址?有没有办法让 DEPTH_LIMIT
工作或扩展 DepthMiddleware
以不抓取文章页面上的链接?谢谢!
最佳答案
为了使 DepthMiddleware 正常工作,元属性需要从一个请求传递到另一个请求,否则,深度
在每个新请求后将被设置为 0。
不幸的是,默认情况下,CrawlSpider 不会将这个元属性从一个请求保留到下一个请求。
这可以通过使用蜘蛛中间件(middlewares.py
)来解决:
from scrapy import Request
class StickyDepthSpiderMiddleware:
def process_spider_output(self, response, result, spider):
key_found = response.meta.get('depth', None)
for x in result:
if isinstance(x, Request) and key_found is not None:
x.meta.setdefault('depth', key_found)
yield x
另外,不要忘记将此中间件包含在您的 settings.py
中:
SPIDER_MIDDLEWARES = { '{your_project_name}.middlewares.StickyDepthSpiderMiddleware' : 100 }
关于python - Scrapy - LinkExtractor 和设置 DEPTH_LIMIT 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51092507/
我目前在我正在构建的抓取工具的设置模块中设置了 DEPTH_LIMIT。我希望能够将深度限制作为命令行参数传递。我尝试了以下作为爬虫(及其变体)的构造函数: def __init__(self
Scrapy 表明它有一个 DEPTH_LIMIT setting ,但没有具体说明什么是“深度”。在抓取页面方面,我看到“深度”指的是“网址的深度”,或http://somedomain.com/t
我正在使用 InitSpider 并在 def __init__(self, *a, **kw): 方法中读取自定义 json 配置. json 配置文件包含一个指令,我可以用它来控制爬网深度。我已经
因此,我传入一个 start_url,它是新闻文章页面(例如 cnn.com )。但是,我只想提取新闻文章本身,我不想跟踪文章页面上的任何链接。为此,我使用 CrawlSpider遵循以下规则: ru
我目前正在使用 Scrapyd 启动爬行蜘蛛和 DEPTH_LIMIT设置在 Scrapy 应用程序设置中进行设置。 我想知道如何在 Scrapyd 中将 深度限制 作为参数传递,从而允许我根据用户的
我是一名优秀的程序员,十分优秀!