urljoin follow example python scrapy

follow - scrapy python documentation



Scrapy: analice una página para extraer elementos, luego siga y almacene el contenido de la URL de los elementos. (2)

Tengo una pregunta sobre cómo hacer esto en scrapy. Tengo una araña que se arrastra para listar páginas de artículos. Cada vez que se encuentra una página de listado, con elementos, hay una devolución de llamada parse_item () que se llama para extraer datos de elementos y generar elementos. Hasta ahora todo bien, todo funciona muy bien.

Pero cada elemento tiene, entre otros datos, una url, con más detalles sobre ese elemento. Quiero seguir esa url y almacenar en otro campo de elemento (url_contents) el contenido obtenido de la url de ese elemento.

Y no estoy seguro de cómo organizar el código para lograrlo, ya que los dos enlaces (enlaces de listados y un enlace de un elemento en particular) se siguen de manera diferente, con devoluciones de llamada en diferentes momentos, pero tengo que correlacionarlos en el mismo proceso .

Mi código hasta ahora se parece a esto:

class MySpider(CrawlSpider): name = "example.com" allowed_domains = ["example.com"] start_urls = [ "http://www.example.com/?q=example", ] rules = ( Rule(SgmlLinkExtractor(allow=(''example/.com'', ''start=''), deny=(''sort=''), restrict_xpaths = ''//div[@class="pagination"]''), callback=''parse_item''), Rule(SgmlLinkExtractor(allow=(''item//detail'', )), follow = False), ) def parse_item(self, response): main_selector = HtmlXPathSelector(response) xpath = ''//h2[@class="title"]'' sub_selectors = main_selector.select(xpath) for sel in sub_selectors: item = ExampleItem() l = ExampleLoader(item = item, selector = sel) l.add_xpath(''title'', ''a[@title]/@title'') ...... yield l.load_item()


Después de algunas pruebas y pensamientos, encontré esta solución que funciona para mí. La idea es usar solo la primera regla, que le da listas de artículos y también, muy importante, agregar follow = True a esa regla.

Y en parse_item (), debe generar una solicitud en lugar de un elemento, pero después de cargar el elemento. La solicitud es para el detalle de la url. Y tienes que enviar el elemento cargado a esa solicitud de devolución de llamada. Usted hace su trabajo con la respuesta, y allí es donde cede el elemento.

Así que el final de parse_item () se verá así:

itemloaded = l.load_item() # fill url contents url = sel.select(item_url_xpath).extract()[0] request = Request(url, callback = lambda r: self.parse_url_contents(r)) request.meta[''item''] = itemloaded yield request

Y luego parse_url_contents () se verá así:

def parse_url_contents(self, response): item = response.request.meta[''item''] item[''url_contents''] = response.body yield item

Si alguien tiene otro (mejor) enfoque, háganoslo saber.

Stefan


Me siento exactamente con el mismo problema y, dado que nadie ha respondido a tu pregunta durante 2 días, me parece que la única solución es seguir esa URL manualmente, desde dentro de tu función parse_item .

Soy nuevo en Scrapy, así que no lo intentaría con eso (aunque estoy seguro de que es posible), pero mi solución será usar urllib y BeatifulSoup para cargar la segunda página manualmente, extraer esa información y guardar como parte del articulo. Sí, mucho más problema que Scrapy hace un análisis normal, pero debería hacer el trabajo con la menor molestia.