2014-06-21 4 views
2

J'essaye de faire une araignée récursive pour extraire le contenu d'un site (exemple: web.com) qui a une structure de lien spécifique. Par exemple:Problèmes récursifs d'exploration de Scrapy

http://web.com/location/profile/12345678?qid=1403226397.5971&source=location&rank=21

http://web.com/location/profile/98765432?qid=1403366850.3991&source=locaton&rank=1

Comme vous pouvez voir que les parties numériques des URL changent et je dois analyser tous les liens suivants cette structure d'URL et extraire itemX, itemY et itemZ .

J'ai traduit la structure du lien en regex comme suit: '\ d +? Qid = \ d +. \ D + & source = emplacement & rank = \ d +'. Et le code Python-Scrapy comme suit, cependant, après que je lance l'araignée, rien est extrait par l'araignée:

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from web.items import webItem 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.http import Request 
from scrapy import log 
import re 
import urllib 

class web_RecursiveSpider(CrawlSpider): 
    name = "web_RecursiveSpider" 
    allowed_domains = ["web.com"] 
    start_urls = ["http://web.com/location/profile",] 

    rules = (Rule (SgmlLinkExtractor(allow=('\d+?qid=\d+.\d+&source=location&rank=\d+',),) 
    , callback="parse_item", follow= True), 
    ) 

    def parse_item(self, response): 
     hxs = HtmlXPathSelector(response) 
     sites = hxs.select('//*') 
     items = [] 

     for site in sites: 
      item = webItem() 
      item["itemX"] = site.select("//span[@itemprop='X']/text()").extract() 
      item["itemY"] = site.select("//span[@itemprop='Y']/text()").extract() 
      item["itemZ"] = site.select("//span[@itemprop='Z']/text()").extract() 
      items.append(item) 
     return items 

Répondre

1

Vous devez échapper ? marque dans l'expression régulière:

'\d+\?qid=\d+.\d+&source=location&rank=\d+' 
    ^

Demo :

>>> import re 
>>> url = "http://web.com/location/profile/12345678?qid=1403226397.5971&source=location&rank=21" 
>>> print re.search('\d+?qid=\d+.\d+&source=location&rank=\d+', url) 
None 
>>> print re.search('\d+\?qid=\d+.\d+&source=location&rank=\d+', url) 
<_sre.SRE_Match object at 0x10be538b8> 

Notez que vous devez également échapper au point, mais il ne touche pas les exemples que vous avez donnés:

'\d+\?qid=\d+\.\d+&source=location&rank=\d+' 
      ^
+0

Merci, cela semble être l'un des problèmes. J'ai essayé votre démo dans Scrapy Shell et cela confirme que l'expression régulière devrait fonctionner maintenant. Cependant, lorsque je lance l'intégralité du code via 'scrapy crawl web_RecursiveSpider -o items.csv -t csv', le fichier CSV n'extrait toujours rien. La sortie cmd dit "... ScrapyDeprecationWarning ... .Myspider hérite de la classe obsolète scrapy.spider.BaseSpider, s'il vous plaît hériter de scrapy.spider.Spider ... INFO: Exploré 0 pages" – KubiK888

+0

Je ne suis pas sûr si le "dépréciation "avertissement est le problème car j'ai d'autres robots de travail en dépit de cet avertissement. Toutes les suggestions ou conseils seront grandement appréciés. – KubiK888

+0

@ KubiK888 non, l'avertissement de dépréciation n'est pas lié au problème. Pourriez-vous vérifier que les liens sont suivis au moins? Mettez une instruction d'impression dans le 'parse_item' et dans la boucle aussi. Merci. – alecxe