Web Scraping con Scrapy

7 views
Skip to first unread message

Dahiana Benitez

unread,
Apr 16, 2021, 10:43:20 AM4/16/21
to Python Monterrey
import time
import pandas as pd
import requests as r
from scrapy.spiders import Spider
from scrapy.item import Item, Field
from scrapy.loader import ItemLoader
from scrapy.selector import Selector
from scrapy.crawler import CrawlerProcess
import scrapy

'''class Aseguradoips(Item):
documento = Field()
#nombres = Field()'''


class IPS(scrapy.Spider):
name = 'IPSBuscar'

custom_settings = {
'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/80.0.3987.149 Safari/537.36'
}

def parse(id_number):
"""
Toma un numero de cedula y extrae toda la informacion accesible desde
consulta al asegurado del portal de IPS
"""

url = 'mi_url'

headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'Upgrade-Insecure-Requests': '1',
'Origin': ' mi_url',
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/80.0.3987.149 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-User': '?1',
'Sec-Fetch-Dest': 'document',
'Referer': ' mi_url',
'Accept-Language': 'en-US,en;q=0.9,es;q=0.8'
}

data = {
'nro_cic': '{}'.format(id_number),
'recuperar': 'Recuperar',
'elegir': '',
'envio': 'ok'
}

html_text = r.post(url=url, headers=headers, data=data).text
sel = Selector(text=html_text)
ips = sel.xpath('.//form[@name="vesbrbacnorc"]').extract()
#print(ips)

#for asegurado in ips:
item = ItemLoader(ips)
documento = item.xpath('//table[2]//tr[2]/td[2]').text()
# nombres = asegurado.xpath('//form[@name="vesbrbacnorc"]/table[2]//tr[2]/td[3]/text()').get()
#item.add_xpath('documento', './/form[@name="vesbrbacnorc"]/table[2]//tr[2]/td[2]/text()')
#yield item.load_item()

yield item.load_item()


if __name__ == '__main__':
id_list = [123, 456, 789, 1011, 1213, 1415]

for id_number in id_list:
parse(id_number)
time.sleep(1)


Colegas, tengo un problema con mi scraping. Debo enviar el id_number a mi url, la url tiene una caja donde ingresar el id_number y debe devolver un formulario y de ese formulario tengo que extraer los datos, ya he probado de todo. Ya saqué una versión con Selenium pero mi jefe me pide que lo haga con Scrapy y no logro resolver el problema. hasta el Selector esta ok me trae el form y los datos pero al instanciar el ItemLoader ya me trae vacio. Si alguien puede ayudarme por favor!!!

Ricardo Azpeitia Pimentel

unread,
Apr 16, 2021, 12:42:20 PM4/16/21
to Dahiana Benitez, Python Monterrey
Hey recomiendo que uses el scrapy shell para probar selectores.
Ejemplo: scrapy shell -s USER_AGENT='custom user agent' 'http://www.example.com'

--
Has recibido este mensaje porque estás suscrito al grupo "Python Monterrey" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a pymty+un...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/pymty/f95bf03d-11ed-4dbf-86af-eadbc6aab810n%40googlegroups.com.

Andres Vargas - zodman

unread,
Apr 16, 2021, 12:51:14 PM4/16/21
to Ricardo Azpeitia Pimentel, Dahiana Benitez, Python Monterrey
creo que sale mejor con un requests/lxml envez de meterle el gran armatoste que es scrapy...

Primero resuelve que el s.post() te funcione, y te devuelva el html q necesitas ..
y ahi partes para procesar con el lxml  o con bs4

https://lxml.de/parsing.html#parsing-html





--
Andres Vargas
http://opensrc.mx

Dahiana Benitez

unread,
Apr 16, 2021, 6:45:40 PM4/16/21
to Python Monterrey
Gracias muchachos!! El problema que tengo es que mi jefe lo quiere en Scrapy y en verdad le di mil vueltas pero no logro resolverlo. Como expuse, hasta la línea en el que instancio el Selector funciona, me devuelve el form por cada id_number como debe traer, pero al instanciar y llamarlo con el ItemLoader me trae vacía la información.

Compañero razpeitia jeje podrías ayudarme un poco mas con el scrapy shell, como usarlo por favor...Gracias :D

Ricardo Azpeitia Pimentel

unread,
Apr 16, 2021, 6:58:09 PM4/16/21
to Dahiana Benitez, Python Monterrey
Bueno, es un poco difícil porque a pesar de que pones la mayoría del código, no tenemos dónde o cómo probar por este pequeño detalle:
url = 'mi_url'
Por eso lo más que podemos ofrecer es son recomendaciones generales.
Si tienes un ejemplo que podamos correr sería más fácil ayudarte.

Saludos

Reply all
Reply to author
Forward
0 new messages