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