tutorial start_requests selectors extractfirst example espaƱol python scrapy

python - start_requests - selectors scrapy



Scrapy start_urls (6)

La clase no tiene una propiedad de rules . Eche un vistazo a http://readthedocs.org/docs/scrapy/en/latest/intro/overview.html y busque "reglas" para encontrar un ejemplo.

La secuencia de comandos (a continuación) de este tutorial contiene dos start_urls .

from scrapy.spider import Spider from scrapy.selector import Selector from dirbot.items import Website class DmozSpider(Spider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/", ] def parse(self, response): """ The lines below is a spider contract. For more info see: http://doc.scrapy.org/en/latest/topics/contracts.html @url http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/ @scrapes name """ sel = Selector(response) sites = sel.xpath(''//ul[@class="directory-url"]/li'') items = [] for site in sites: item = Website() item[''name''] = site.xpath(''a/text()'').extract() item[''url''] = site.xpath(''a/@href'').extract() item[''description''] = site.xpath(''text()'').re(''-/s[^/n]*//r'') items.append(item) return items

¿Pero por qué raspa solo estas 2 páginas web? Veo allowed_domains = ["dmoz.org"] pero estas dos páginas también contienen enlaces a otras páginas que están dentro del dominio dmoz.org . ¿Por qué no los raspa?


Si usa BaseSpider , dentro de la devolución de llamada, tiene que extraer las URL deseadas y devolver un objeto Request .

Si utiliza CrawlSpider , las reglas y el SgmlLinkExtractor asociado a las reglas se encargarían de la extracción de enlaces.


start_urls atributo de clase start_urls contiene las URL de inicio, nada más. Si ha extraído urls de otras páginas que desea eliminar, ceda el resultado de las solicitudes correspondientes de devolución de llamada con [otra] devolución de llamada:

class Spider(BaseSpider): name = ''my_spider'' start_urls = [ ''http://www.domain.com/'' ] allowed_domains = [''domain.com''] def parse(self, response): ''''''Parse main page and extract categories links.'''''' hxs = HtmlXPathSelector(response) urls = hxs.select("//*[@id=''tSubmenuContent'']/a[position()>1]/@href").extract() for url in urls: url = urlparse.urljoin(response.url, url) self.log(''Found category url: %s'' % url) yield Request(url, callback = self.parseCategory) def parseCategory(self, response): ''''''Parse category page and extract links of the items.'''''' hxs = HtmlXPathSelector(response) links = hxs.select("//*[@id=''_list'']//td[@class=''tListDesc'']/a/@href").extract() for link in links: itemLink = urlparse.urljoin(response.url, link) self.log(''Found item link: %s'' % itemLink, log.DEBUG) yield Request(itemLink, callback = self.parseItem) def parseItem(self, response): ...

Si aún desea personalizar la creación de solicitudes de inicio, anule el método BaseSpider.start_requests ()



Si usa una regla para seguir enlaces (que ya está implementada en scrapy), la araña también los rascará. Espero haber ayudado ...

from scrapy.contrib.spiders import BaseSpider, Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.selector import HtmlXPathSelector class Spider(BaseSpider): name = ''my_spider'' start_urls = [''http://www.domain.com/''] allowed_domains = [''domain.com''] rules = [Rule(SgmlLinkExtractor(allow=[], deny[]), follow=True)] ...


no escribiste la función para repartir las URL lo que quieres obtener. De dos maneras para resolverlo. Utiliza la regla (crawlspider) 2: escribe la función para tratar las nuevas URL y ponlas en la función de devolución de llamada. .