Solución:
Básicamente, tiene muchas herramientas para elegir:
- scrapy
- hermosa sopa
- lxml
- mecanizar
- solicitudes (y grequests)
- selenio
- ghost.py
Estas herramientas tienen diferentes propósitos, pero se pueden combinar según la tarea.
Scrapy es una herramienta poderosa y muy inteligente para rastrear sitios web y extraer datos. Pero, cuando se trata de manipular la página: hacer clic en botones, completar formularios, se vuelve más complicado:
- a veces, es fácil simular el llenado / envío de formularios haciendo una acción de formulario subyacente directamente en scrapy
- A veces, tienes que usar otras herramientas para ayudar a scrapy, como mecanizar o selenio.
Si hace su pregunta más específica, le ayudará a comprender qué tipo de herramientas debe utilizar o elegir.
Eche un vistazo a un ejemplo de mezcla interesante de scrapy y selenio. Aquí, la tarea de selenio es hacer clic en el botón y proporcionar datos para los elementos desechados:
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 sobre cómo usar scrapy en su 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
Guárdalo en spider.py
y correr a través de scrapy runspider spider.py -o output.json
y en output.json
ya verás:
{"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, optaría por:
- solicitudes para enviar la solicitud de publicación
- hermosa sopa para extraer los datos elegidos de la página de resultados
El valor agregado de Scrapy realmente se mantiene en su capacidad para seguir enlaces y rastrear un sitio web, no creo que sea la herramienta adecuada para el trabajo si sabes exactamente lo que estás buscando.
Personalmente usaría mecanizar ya que no tengo ninguna experiencia con scrapy. Sin embargo, una biblioteca llamada scrapy diseñada para raspar la pantalla debería estar lista para la tarea. Solo probaría con ambos y vería cuál hace el trabajo mejor / más fácil.