为什么scrapy错过了一些链接?

时间:2016-05-09 12:51:19

标签: python-2.7 scrapy

我正在使用Python的“scrapy”库抓取网站“www.accell-group.com”。该网站被完全删除,总共131页(文本/ html)和2个文档(application / pdf)被识别。 Scrapy没有发出任何警告或错误。我的算法应该刮掉每一个链接。我使用CrawlSpider。

然而,当我查看“sc {”报告为“刮除/处理”的页面“http://www.accell-group.com/nl/investor-relations/jaarverslagen/jaarverslagen-van-accell-group.htm”时,我看到有更多的pdf文档,例如“http://www.accell-group.com/files/4/5/0/1/Jaarverslag2014.pdf” 。我找不到任何理由不被刮掉。此页面上没有动态/ JavaScript内容。 “http://www.airproducts.com/robots.txt”中不禁止使用。

你可能知道为什么会这样吗? 这可能是因为“files”文件夹不在“http://www.accell-group.com/sitemap.xml”中?

提前致谢!

我的代码:

class PyscrappSpider(CrawlSpider):
    """This is the Pyscrapp spider"""
    name = "PyscrappSpider"

    def__init__(self, *a, **kw):

        # Get the passed URL
        originalURL =  kw.get('originalURL')
        logger.debug('Original url = {}'.format(originalURL))

        # Add a protocol, if needed
        startURL = 'http://{}/'.format(originalURL)
        self.start_urls = [startURL]

        self.in_redirect = {}
        self.allowed_domains = [urlparse(i).hostname.strip() for i in self.start_urls]
        self.pattern = r""
        self.rules = (Rule(LinkExtractor(deny=[r"accessdenied"]), callback="parse_data", follow=True), )

        # Get WARC writer        
        self.warcHandler = kw.get('warcHandler')

        # Initialise the base constructor
        super(PyscrappSpider, self).__init__(*a, **kw)


    def parse_start_url(self, response):
        if (response.request.meta.has_key("redirect_urls")):
            original_url = response.request.meta["redirect_urls"][0]
            if ((not self.in_redirect.has_key(original_url)) or (not self.in_redirect[original_url])):
                self.in_redirect[original_url] = True
                self.allowed_domains.append(original_url)
        return self.parse_data(response)

    def parse_data(self, response):

        """This function extracts data from the page."""

        self.warcHandler.write_response(response)

        pattern = self.pattern

        # Check if we are interested in the current page
        if (not response.request.headers.get('Referer') 
            or re.search(pattern, self.ensure_not_null(response.meta.get('link_text')), re.IGNORECASE) 
            or re.search(r"/(" + pattern + r")", self.ensure_not_null(response.url), re.IGNORECASE)):

            logging.debug("This page gets processed = %(url)s", {'url': response.url})

            sel = Selector(response)

            item = PyscrappItem()
            item['url'] = response.url


            return item
        else:

            logging.warning("This page does NOT get processed = %(url)s", {'url': response.url})
            return response.request

1 个答案:

答案 0 :(得分:1)

正确删除或扩展您的“allowed_domains”变量,您应该没问题。默认情况下,spider遵循的所有URL都受allowed_domains限制。

编辑:本案特别提及pdfs。根据默认值deny_extensions(请参阅hereIGNORED_EXTENSIONS(请参阅here),将PDF明确排除为扩展名。

要允许您的应用程序抓取PDF,您只需通过明确设置IGNORED_EXTENSIONS的值将其从deny_extensions中排除:

from scrapy.linkextractors import IGNORED_EXTENSIONS

self.rules = (Rule(...

LinkExtractor(deny=[r"accessdenied"], deny_extensions=set(IGNORED_EXTENSIONS)-set(['pdf']))

..., callback="parse_data"...

所以,我担心,这就是“为什么Scrapy会错过一些链接?”这个问题的答案。正如您可能会看到它只是打开了进一步问题的大门,比如“如何处理这些PDF”,但我想这是另一个问题的主题。