gpt4 book ai didi

python - 如何阻止 Scrapy CrawlSpider 跟踪超出所需的 URL?

转载 作者:太空宇宙 更新时间:2023-11-03 20:18:53 24 4
gpt4 key购买 nike

我想用 scrapy 编写一个爬虫,从网站上提取 pdf。到目前为止,爬虫在下载 pdf 方面工作得很好。然而,它遵循许多链接的方式,尽管我已经尝试了几种方法来阻止它这样做。

按照我的理解,我可以使用 LinkExtractor 的规则来限制 scrapy 的 Crawlspider 跟踪链接。

我已经构建了一个自定义 LinkExtractor(并且还尝试在不使用自定义 LinkExtractor 的情况下直接构建规则,但这产生了相同的结果。)

基本上我只想从页面中提取 PDF,任何不以 .pdf 结尾的链接都不应该被抓取。

到目前为止,以下代码有效,仅使用 parse_docs() 方法保存 PDF,但是,我希望非 pdf 链接根本不会发送到 parse_docs() 函数。

我也尝试过在 Linkextractor 中使用拒绝属性(想法 1)或将 linkextractor 限制为仅一个特定的 PDF(想法 2),但许多 index.php?id= 链接不断被抓取。

(抱歉代码太长,但我认为这样你可以只运行文件,而不必重建一半的爬虫,如果需要缩短,请随意)

# -*- coding: utf-8 -*-
import scrapy

import re
from itertools import chain
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
EXTENSIONS = [".pdf"]

class CustomLinkExtractor(LinkExtractor):
def __init__(self, *args, **kwargs):
super(CustomLinkExtractor, self).__init__(*args, **kwargs)
# Keep the default values in "deny_extensions" *except* for those types we want
self.deny_extensions = [ext for ext in self.deny_extensions if ext not in EXTENSIONS]
self.allow = (r'.*\.pdf',)
#self.deny = ('index\.php',) #idea 1

class BremenSpider(CrawlSpider):
name = 'bremen'
allowed_domains = ['www.bremische-buergerschaft.de',"bremische-buergerschaft.de"]
start_urls = ['https://www.bremische-buergerschaft.de/index.php?id=570']

def __init__(self, *args, **kwargs):
self.rules = (
Rule(CustomLinkExtractor(), callback="parse_docs"),
#idea 2
#Rule(LinkExtractor(allow = ('/dokumente/wp19/land/protokoll/P19L0076.pdf')), callback="parse_docs"),
)
super(BremenSpider, self).__init__(*args, **kwargs)


def parse_docs(self, response):
if hasattr(response, "text"):
# The response is text - we assume html. Normally we'd do something
# with this, but this demo is just about pdf content, so...
self.logger.info("not parsing url: %s", response.url)
pass
else:
extension = list(filter(lambda x: response.url.lower().endswith(x), EXTENSIONS))[0]
if extension:
# This is a pdf
path = response.url.split('/')[-1]
self.logger.info('Saving PDF %s', path)
with open(path, 'wb') as f:
f.write(response.body)

我希望只抓取带有index.php?id=570和.pdf链接的start_url,但是当我在CLI上运行爬网程序时,它还会抓取其他index.php?...链接的负载。

我是否误解了 CLI 输出,或者我的 LinkExtractor 是否不正确?

最佳答案

pdf(不带点)包含在 scrapy.linkextractors.IGNORED_EXTENSIONS 中,因此默认情况下会忽略它。我认为以下应该可以解决您的问题:

from scrapy.linkextractors import IGNORED_EXTENSIONS
CUSTOM_IGNORED_EXTENSIONS = IGNORED_EXTENSIONS.copy()
CUSTOM_IGNORED_EXTENSIONS.remove('pdf')

然后,在蜘蛛的 rules 属性中,您可以使用以下链接提取器定义规则:LinkExtractor(allow=r'.*\.pdf', Deny_extensions=CUSTOM_IGNORED_EXTENSIONS)

关于python - 如何阻止 Scrapy CrawlSpider 跟踪超出所需的 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58276127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com