簡體   English   中英

為什么scrapy會錯過某些鏈接?

[英]Why does scrapy miss some links?

我正在使用Python的“ scrapy”庫抓取網站“ www.accell-group.com”。 該網站被完全刮掉了,共識別出131頁(text / html)和2個文檔(application / pdf)。 Scrapy沒有引發任何警告或錯誤。 我的算法應該抓取每個鏈接。 我使用CrawlSpider。

但是,當我查看“ http://www.accell-group.com/nl/investor-relations/jaarverslagen/jaarverslagen-van-accell-group.htm ”頁面時,“ scrapy”將其報告為已抓取/處理后,我發現有更多的pdf文檔,例如“ http://www.accell-group.com/files/4/5/0/1/Jaarverslag2014.pdf ”。 我找不到任何不被刪除的原因。 此頁面上沒有動態/ JavaScript內容。 http://www.airproducts.com/robots.txt ”中不禁止使用。

您可能不知道為什么會發生嗎? 可能是因為“文件”文件夾不在“ 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

適當刪除或擴展您的“ allowed_domains”變量,就可以了。 默認情況下,爬蟲遵循的所有URL均受allowed_domains限制。

編輯:此案特別提到了pdf。 PDF文件被明確排除在外的擴展按默認值deny_extensions (見這里 ),這是IGNORED_EXTENSIONS (見這里 )。

要允許您的應用程序對PDF進行爬網,您需要做的就是通過明確設置deny_extensions的值來將它們從IGNORED_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”,但我想這是另一個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM