Datos de Python que raspan con Scrapy

Quiero eliminar los datos de un sitio web que tiene TextFields, Buttons, etc. y mi requisito es rellenar los campos de texto y enviar el formulario para obtener los resultados y luego eliminar los puntos de datos de la página de resultados.

Quiero saber si Scrapy tiene esta función o si alguien puede recomendar una biblioteca en Python para realizar esta tarea.

(editado)
Quiero raspar los datos del siguiente sitio web:
http://a836-acris.nyc.gov/DS/DocumentSearch/DocumentType

Mi requisito es seleccionar los valores de ComboBoxes y presionar el botón de búsqueda y raspar los puntos de datos de la página de resultados.

PS Estoy usando el controlador de selenium Firefox para raspar los datos de otro sitio web, pero esa solución no es buena porque el controlador de selenium Firefox depende del EXE de Firefox, es decir, Firefox debe estar instalado antes de ejecutar el raspador.

    El controlador de Selenium Firefox consume alrededor de 100 MB de memoria para una instancia y mi requisito es ejecutar muchas instancias a la vez para acelerar el proceso de raspado, de modo que también exista una limitación de memoria.

    Firefox se bloquea a veces durante la ejecución del raspador, no sé por qué. También necesito una ventana menos de raspado que no es posible en el caso del controlador Selenium Firefox.

    Mi objective final es ejecutar los raspadores en Heroku y tengo un entorno Linux allí para que el controlador de selenium Firefox no funcione en Heroku. Gracias

    Básicamente, tienes muchas herramientas para elegir:

    • áspero
    • hermoso
    • lxml
    • mecanizar
    • peticiones (y grequests )
    • selenium
    • fantasma.py

    Estas herramientas tienen diferentes propósitos, pero se pueden combinar según la tarea.

    Scrapy es una herramienta potente y muy inteligente para rastrear sitios web y extraer datos. Pero, cuando se trata de manipular la página: hacer clic en los botones, rellenar formularios, se vuelve más complicado:

    • a veces, es fácil simular el llenado / envío de formularios haciendo que el formulario subyacente actúe directamente en scrapy
    • a veces, tienes que usar otras herramientas para ayudar a desechar, como mecanizar o selenium

    Si hace que su pregunta sea más específica, ayudará a entender qué tipo de herramientas debe usar o elegir.

    Eche un vistazo a un ejemplo de mezcla interesante de scrapy y selenium. Aquí, la tarea de selenium es hacer clic en el botón y proporcionar datos para los artículos desechables:

    import time from scrapy.item import Item, Field from selenium import webdriver from scrapy.spider import BaseSpider class ElyseAvenueItem(Item): name = Field() class ElyseAvenueSpider(BaseSpider): name = "elyse" allowed_domains = ["ehealthinsurance.com"] start_urls = [ 'http://www.ehealthinsurance.com/individual-family-health-insurance?action=changeCensus&census.zipCode=48341&census.primary.gender=MALE&census.requestEffectiveDate=06/01/2013&census.primary.month=12&census.primary.day=01&census.primary.year=1971'] def __init__(self): self.driver = webdriver.Firefox() def parse(self, response): self.driver.get(response.url) el = self.driver.find_element_by_xpath("//input[contains(@class,'btn go-btn')]") if el: el.click() time.sleep(10) plans = self.driver.find_elements_by_class_name("plan-info") for plan in plans: item = ElyseAvenueItem() item['name'] = plan.find_element_by_class_name('primary').text yield item self.driver.close() 

    ACTUALIZAR:

    Aquí hay un ejemplo de cómo usar scrapy en tu caso:

     from scrapy.http import FormRequest from scrapy.item import Item, Field from scrapy.selector import HtmlXPathSelector from scrapy.spider import BaseSpider class AcrisItem(Item): borough = Field() block = Field() doc_type_name = Field() class AcrisSpider(BaseSpider): name = "acris" allowed_domains = ["a836-acris.nyc.gov"] start_urls = ['http://a836-acris.nyc.gov/DS/DocumentSearch/DocumentType'] def parse(self, response): hxs = HtmlXPathSelector(response) document_classes = hxs.select('//select[@name="combox_doc_doctype"]/option') form_token = hxs.select('//input[@name="__RequestVerificationToken"]/@value').extract()[0] for document_class in document_classes: if document_class: doc_type = document_class.select('.//@value').extract()[0] doc_type_name = document_class.select('.//text()').extract()[0] formdata = {'__RequestVerificationToken': form_token, 'hid_selectdate': '7', 'hid_doctype': doc_type, 'hid_doctype_name': doc_type_name, 'hid_max_rows': '10', 'hid_ISIntranet': 'N', 'hid_SearchType': 'DOCTYPE', 'hid_page': '1', 'hid_borough': '0', 'hid_borough_name': 'ALL BOROUGHS', 'hid_ReqID': '', 'hid_sort': '', 'hid_datefromm': '', 'hid_datefromd': '', 'hid_datefromy': '', 'hid_datetom': '', 'hid_datetod': '', 'hid_datetoy': '', } yield FormRequest(url="http://a836-acris.nyc.gov/DS/DocumentSearch/DocumentTypeResult", method="POST", formdata=formdata, callback=self.parse_page, meta={'doc_type_name': doc_type_name}) def parse_page(self, response): hxs = HtmlXPathSelector(response) rows = hxs.select('//form[@name="DATA"]/table/tbody/tr[2]/td/table/tr') for row in rows: item = AcrisItem() borough = row.select('.//td[2]/div/font/text()').extract() block = row.select('.//td[3]/div/font/text()').extract() if borough and block: item['borough'] = borough[0] item['block'] = block[0] item['doc_type_name'] = response.meta['doc_type_name'] yield item 

    spider.py en spider.py y ejecútelo a través de scrapy runspider spider.py -o output.json y en output.json verá:

     {"doc_type_name": "CONDEMNATION PROCEEDINGS ", "borough": "Borough", "block": "Block"} {"doc_type_name": "CERTIFICATE OF REDUCTION ", "borough": "Borough", "block": "Block"} {"doc_type_name": "COLLATERAL MORTGAGE ", "borough": "Borough", "block": "Block"} {"doc_type_name": "CERTIFIED COPY OF WILL ", "borough": "Borough", "block": "Block"} {"doc_type_name": "CONFIRMATORY DEED ", "borough": "Borough", "block": "Block"} {"doc_type_name": "CERT NONATTCHMENT FED TAX LIEN ", "borough": "Borough", "block": "Block"} ... 

    Espero que ayude.

    Si simplemente desea enviar el formulario y extraer datos de la página resultante, me gustaría ir a:

    • solicitudes para enviar la solicitud de publicación
    • Sopa hermosa para extraer los datos elegidos de la página de resultados.

    El valor agregado de Scrapy realmente tiene su capacidad de seguir enlaces y rastrear un sitio web. No creo que sea la herramienta adecuada para el trabajo si sabe exactamente lo que está buscando.

    Personalmente usaría mecanizar, ya que no tengo experiencia con scrapy. Sin embargo, una biblioteca llamada scrapy diseñada para el raspado de la pantalla debe estar lista para la tarea. Solo me gustaría ir con los dos y ver cuál es el mejor o más fácil para el trabajo.