<jupyter_start><jupyter_text>1. Scrapy: Temas más avanzados  1.1 Scrapy: obteniendo url absoluta Scrapy viene equipado con la funcion urljoin el cual nos permite unir la url base + url deseada<jupyter_code>import requests

from scrapy.selector import Selector
from scrapy.http import Request
url = 'https://quotes.toscrape.com/'
response = requests.get( url )

html = response.content
# pasando contenido al selector
sel = Selector(text = html)<jupyter_output><empty_output><jupyter_text>Ejemplo utilizado dentro del proyecto scrapy<jupyter_code>#obteniendo siguiente pagina
link = sel.css("li.next > a::attr(href)").get()
link
response.url[:-1] + link
#obteniendo url_absoluta
url_absoluta_libro=response.urljoin(link)<jupyter_output><empty_output><jupyter_text>1.2 Scrapy: Realizando Request La clase Request nos permite ingresar a una nueva página web para continuar con el scrapeo de esta  Recuerden revisar la documentación completa en la página oficial  Ejemplo utilizando dentro del proyecto scrapy<jupyter_code>#libreria importada dentro del proyecto
from scrapy.http import Request
#Forma request básica
Request(url_absoluta_libro,callback=self.parse)<jupyter_output><empty_output><jupyter_text>1.3 Scrapy Shell: Fetch() El shell de scrapy posee la funcion Fetch() la cual nos permite ingresar a una nueva página para de este modo seguir trabajando desde el shell   Ejemplo<jupyter_code># desde la consola de scrapy shell realizar
url="https://reddit.com"
fetch(url)<jupyter_output><empty_output><jupyter_text>1.4. Scrapy: Navegando entre páginas Muchas veces nos encontramos con casos en que se requiere obtener información de la primera página y luego se requiere ir navegando dentro de sus páginas para obtener más datos de ella. Para estos casos se requiere utilizar el método Request que vimos anteriormente<jupyter_code># para introducirnos en una página adicional sin pasar datos previamente extraidos
yield Request(absolute_url, callback=self.parse_book)<jupyter_output><empty_output><jupyter_text><jupyter_code># para introducirnos en una página adicional con datos previamente extraidos
meta = {'URL': absolute_url, 
        'Title': title, 
        'Address':address}

yield Request(absolute_url, callback=self.parse_page, meta= meta)
# sobre la nueva funcion, debemos recuperar los valores anteriormente recopilados

url = response.meta.get('URL')
title = response.meta.get('Title')
address = response.meta.get('Address')<jupyter_output><empty_output><jupyter_text>Ejemplo<jupyter_code>import requests
from scrapy.selector import Selector
from scrapy.http import Request
url = 'http://books.toscrape.com/'
response = requests.get( url )

html = response.content
sel = Selector(text = html)
bloques = sel.css('article.product_pod')
bloque = bloques[1]
bloque.css('h3>a::attr(title)').get()
url_book = bloque.css('h3>a::attr(href)').get()
url_relativa = sel.css('li.next > a::attr(href)').get()
response.url + url_book

#http://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html<jupyter_output><empty_output><jupyter_text>Siguiente pagina en libro<jupyter_code>response = requests.get( response.url + url_book )
html = response.content
sel = Selector(text = html)
table = sel.css('table.table.table-striped')
table.css('tr > th::text').getall()
    
table.css('tr > td::text').getall()<jupyter_output><empty_output><jupyter_text>2. Scrapy: Completado Formularios Por medio del metodo FormRequest se puede realizar el login en las páginas web.  Recuerden revisar la documentación completa en la página oficial  Ejemplo<jupyter_code>from scrapy.http import FormRequest
# se requieren conocer los parámetros con lo que será necesario loguearse
FormRequest('http://quotes.toscrape.com/login',
                          formdata={'csrf_token': csrf_token,
                                    'username': 'abc',
                                    'password': '123'},
                          callback=self.parse_after_login)
# cargando
response = requests.get( 'https://quotes.toscrape.com/login' )
html = response.content
sel = Selector(text = html)
sel.xpath('//input[@name="csrf_token"]').css('::attr(value)').get()
table = sel.css('table.table.table-striped')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10165876777251184, 'fraction_numerical': 0.004739336492890996, 'mean_word_length': 5.328335832083958, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 43, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '133179', 'license': 'Apache-2.0', 'n_tokens_mistral': 1412, 'n_tokens_neox': 1397, 'n_words': 362, 'path': 'Modulo3/1. Scrapy .ipynb', 'repo_name': 'gdelgador/Curso-WebScraping', 'size': '4220'}