example python web-scraping scrapy

python - example - Scrapy: AttributeError: el objeto ''YourCrawler'' no tiene ningún atributo ''parse_following_urls''



scrapy python install (1)

En tu código,

yield Request(url, callback=self.parse_following_urls, dont_filter=True)

Usaste parse_following_urls con self.
Pero parse_following_urls se define en la función de análisis, por lo que no es un método de YourCrawler.
Es por eso que dijo el error
AttributeError: ''YourCrawler'' object has no attribute ''parse_following_urls''
deberías asignarlo como:

class YourCrawler(CrawlSpider): def parse_following_urls(self, response): ....

para hacerlo el método de la clase.

editar

para una pregunta adicional:

En su código s.xpath(''///*[@id="results"]/ul/li/div[1]/h4/a[2]/@href'') indica el atributo href del elemento a tag de la página html que quieres eliminar.
Sin embargo, solo es ''/ book /? Id = 9780374281083'', no la URL completa.
por lo tanto, debe hacer que sea como: https://lacentral.com/book/?id=9780374281083 para usarlo.

Estoy escribiendo una araña de scrapy. He estado leyendo esta pregunta: Scrapy: raspando una lista de enlaces , y puedo hacer que reconozca las urls en una página de lista, pero no puedo ingresar a las URL y guardar los datos que quiero ver.

from scrapy.contrib.spiders import CrawlSpider from scrapy.selector import Selector from scrapy.http import Request class YourCrawler(CrawlSpider): name = "bookstore_2" start_urls = [ ''https://example.com/materias/?novedades=LC&p'', ] def parse(self, response): # go to the urls in the list s = Selector(response) page_list_urls = s.xpath(''///*[@id="results"]/ul/li/div[1]/h4/a[2]/@href'').extract() for url in page_list_urls: yield Request(url, callback=self.parse_following_urls, dont_filter=True) # For the urls in the list, go inside, and in div#main, take the div.ficha > div.caracteristicas > ul > li def parse_following_urls(self, response): #Parsing rules go here for each_book in response.css(''div#main''): yield { ''book_isbn'': each_book.css(''div.ficha > div.caracteristicas > ul > li'').extract(), } # Return back and go to bext page in div#paginat ul li.next a::attr(href) and begin again next_page = response.css(''div#paginat ul li.next a::attr(href)'').extract_first() if next_page is not None: next_page = response.urljoin(next_page) yield scrapy.Request(next_page, callback=self.parse)

Da un error:

AttributeError: ''YourCrawler'' object has no attribute ''parse_following_urls''

¡Y no entiendo por qué!

EDITAR -

Como dice la respuesta, tuve que cerrar el método con la sangría como aquí:

from scrapy.contrib.spiders import CrawlSpider from scrapy.selector import Selector from scrapy.http import Request class YourCrawler(CrawlSpider): name = "bookstore_2" start_urls = [ ''https://example.com/materias/?novedades=LC&p'', ] def parse(self, response): # go to the urls in the list s = Selector(response) page_list_urls = s.xpath(''///*[@id="results"]/ul/li/div[1]/h4/a[2]/@href'').extract() for url in page_list_urls: yield Request(url, callback=self.parse_following_urls, dont_filter=True) # For the urls in the list, go inside, and in div#main, take the div.ficha > div.caracteristicas > ul > li def parse_following_urls(self, response): #Parsing rules go here for each_book in response.css(''div#main''): yield { ''book_isbn'': each_book.css(''div.ficha > div.caracteristicas > ul > li'').extract(), } # Return back and go to bext page in div#paginat ul li.next a::attr(href) and begin again next_page = response.css(''div#paginat ul li.next a::attr(href)'').extract_first() if next_page is not None: next_page = response.urljoin(next_page) yield scrapy.Request(next_page, callback=self.parse)

Pero hay otro problema, creo que relacionado con las URL, y ahora estoy teniendo este seguimiento:

Traceback (most recent call last): File "/usr/local/lib/python2.7/site-packages/scrapy/utils/defer.py", line 102, in iter_errback yield next(it) File "/usr/local/lib/python2.7/site-packages/scrapy/spidermiddlewares/offsite.py", line 29, in process_spider_output for x in result: File "/usr/local/lib/python2.7/site-packages/scrapy/spidermiddlewares/referer.py", line 339, in <genexpr> return (_set_referer(r) for r in result or ()) File "/usr/local/lib/python2.7/site-packages/scrapy/spidermiddlewares/urllength.py", line 37, in <genexpr> return (r for r in result or () if _filter(r)) File "/usr/local/lib/python2.7/site-packages/scrapy/spidermiddlewares/depth.py", line 58, in <genexpr> return (r for r in result or () if _filter(r)) File "/Users/nikita/scrapy/bookstore_2/bookstore_2/spiders/bookstore_2.py", line 16, in parse yield Request(url, callback=self.parse_following_urls, dont_filter=True) File "/usr/local/lib/python2.7/site-packages/scrapy/http/request/__init__.py", line 25, in __init__ self._set_url(url) File "/usr/local/lib/python2.7/site-packages/scrapy/http/request/__init__.py", line 58, in _set_url raise ValueError(''Missing scheme in request url: %s'' % self._url) ValueError: Missing scheme in request url: /book/?id=9780374281083

Tal vez porque tengo que decir Scrappy cuál es la URL base? ¿Debo agregar algún lugar a urljoin?

EDIT_2 ---

Ok, el problema fue con las urls. Añadiendo

response.urljoin(

resuelto este problema