4

私は Scrapy と Python を学んでいて、空のプロジェクトから始めました。私は Scrapy LxmlLinkExtractor を使用してリンクを解析していますが、HTML 以外のリンク/ページ (PDfs やその他のドキュメントなど) に遭遇すると、スパイダーは常にスタックします。

質問: これらの URL のみを保存したい場合 (ドキュメントのコンテンツは今のところ必要ありません...)

ドキュメントのあるページの例: http://afcorfmc.org/2009.html

これが私のスパイダーコードです:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.lxmlhtml import LxmlLinkExtractor
from super.items import SuperItem
from scrapy.selector import Selector

class mySuper(CrawlSpider):
    name="super"
    #on autorise seulement le crawl du site indiqué dans allowed_domains
    allowed_domains = ['afcorfmc.org']

    #démarrage sur la page d'accueil du site
    start_urls = ['http://afcorfmc.org']

    rules = (Rule (LxmlLinkExtractor(allow=(),deny=(),restrict_xpaths=()), callback="parse_o", follow= True),)

    def parse_o(self,response):
        #récupération des datas récoltées (contenu de la page)
        sel = Selector(response)

        #on prépare item, on va le remplir (souvenez-vous, dans items.py)
        item = SuperItem()

        #on stocke l'url de la page dans le tableau item
        item['url'] = response.url

        #on récupère le titre de la page ( titre ) grâce à un chemin xpath
        #item['titre'] = sel.xpath('//title/text()').extract()

        # on fait passer item à la suite du processus
        yield item
4

1 に答える 1

4

スクレイピー LinkExtractor docsで説明されているようにLxmlLinkExtractor、デフォルトでいくつかの拡張子を持つリンクを除外します: https://github.com/scrapy/scrapy/blob/master/scrapy/linkextractors/ init .py#L20を参照してください

この拡張子のリストには.pdf.ppt.

deny_extensionsインスタンスにパラメーターを追加して、LxmlLinkExtractor空のままにすることができます。次に例を示します。

$ scrapy shell http://afcorfmc.org/2009.html
2014-10-27 10:27:02+0100 [scrapy] INFO: Scrapy 0.24.4 started (bot: scrapybot)
...
2014-10-27 10:27:03+0100 [default] DEBUG: Crawled (200) <GET http://afcorfmc.org/2009.html> (referer: None)
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x7f5b1a6f4910>
[s]   item       {}
[s]   request    <GET http://afcorfmc.org/2009.html>
[s]   response   <200 http://afcorfmc.org/2009.html>
[s]   settings   <scrapy.settings.Settings object at 0x7f5b2013f450>
[s]   spider     <Spider 'default' at 0x7f5b19e9bed0>
[s] Useful shortcuts:
[s]   shelp()           Shell help (print this help)
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects
[s]   view(response)    View response in a browser

In [1]: from scrapy.contrib.linkextractors.lxmlhtml import LxmlLinkExtractor

In [2]: lx = LxmlLinkExtractor(allow=(),deny=(),restrict_xpaths=(), deny_extensions=())

In [3]: lx.extract_links(response)
Out[3]: 
[Link(url='http://afcorfmc.org/documents/TOPOS/2009/MARS/ANATOMO_PATHOLOGIE_Dr_Guinebretiere.ppt', text='ANATOMO_PATHOLOGIE_Dr_Guinebretiere.ppt', fragment='', nofollow=False),
 Link(url='http://afcorfmc.org/documents/TOPOS/2009/MARS/CHIMIOTHERAPIE_Dr_Toledano.ppt', text='CHIMIOTHERAPIE_Dr_Toledano.ppt', fragment='', nofollow=False),
 Link(url='http://afcorfmc.org/documents/TOPOS/2009/MARS/CHIRURGIE_Dr_Guglielmina.ppt', text='CHIRURGIE_Dr_Guglielmina.ppt', fragment='', nofollow=False),
 Link(url='http://afcorfmc.org/documents/TOPOS/2009/MARS/CHIRURGIE_Dr_Sebban.ppt', text='CHIRURGIE_Dr_Sebban.ppt', fragment='', nofollow=False),
 Link(url='http://afcorfmc.org/documents/TOPOS/2009/MARS/Cas_clinique_oesophage.ppt', text='Cas_clinique_oesophage.ppt', fragment='', nofollow=False),
 Link(url='http://afcorfmc.org/documents/TOPOS/2009/MARS/IMAGERIE_Dr_Seror.ppt', text='IMAGERIE_Dr_Seror.ppt', fragment='', nofollow=False),
 ...
 Link(url='http://afcorfmc.org/documents/TOPOS/2009/OCTOBRE/VB4_Technique%20monoisocentrique%20dans%20le%20sein%20Vero%20Avignon%202009.pdf', text='VB4_Technique monoisocentrique dans le sein Vero Avignon 2009.pdf', fragment='', nofollow=False)]

In [4]: 
于 2014-10-27T09:28:36.650 に答える