Página 2 de 4

Re: Mejorar scrapertools

Publicado: 09 Ene 2016, 11:38
por divadr
Las cookies son necesarias...
Y si no me equivoco si que se estan usando...
Se que se usan dos librerias para gestionar las cookies y no se para que si por lo que he probado con una funciona en todas las plataformas... esto es como el jsontools que prueba varias librerias... pero no veo la utilidad si con import json funciona en todas las plataformas

El cache es un tema interesante... se que tal como viene esta desactivado y no se usa.. yo lo he estado usando y aparentemente funciona correctamente...

No se con que idea se introdujo ni porque no se usa.. tampoco no se hasta que punto tiene ventajas de usarlo o no usarlo... pero seria un tema interesante para hablar

Re: Mejorar scrapertools

Publicado: 09 Ene 2016, 11:47
por SeiTaN
divadr escribió:Las cookies son necesarias...
Y si no me equivoco si que se estan usando...
Se que se usan dos librerias para gestionar las cookies y no se para que si por lo que he probado con una funciona en todas las plataformas... esto es como el jsontools que prueba varias librerias... pero no veo la utilidad si con import json funciona en todas las plataformas

El cache es un tema interesante... se que tal como viene esta desactivado y no se usa.. yo lo he estado usando y aparentemente funciona correctamente...

No se con que idea se introdujo ni porque no se usa.. tampoco no se hasta que punto tiene ventajas de usarlo o no usarlo... pero seria un tema interesante para hablar
divadr, la liberia que dices que funcione, supongo que es cookielib, que está a partir de la versión 2.4 de python, por eso mi pregunta, para eliminar la referencia de ClientCookie.

La caché vendría bien si por ejemplo la página no se encuentra disponible en ese momento por un HTTPError, asi se podría acceder, avisando evidentemente que no se obtienen los datos en "modo live".
También habría que tener en cuenta cuanto ocupa el tema del cacheo.

A colación de la cache, para obtener los datos de las webs (tengo que probarlo con más detalle), en las headers, he visto que algunas aceptan "Acept-Encodig: gzip" pero no se está mandando por defecto, por lo cual perdemos una mejora que haría que bajar las páginas fuera más rápido.

Re: Mejorar scrapertools

Publicado: 09 Ene 2016, 11:53
por SeiTaN
Olvidad lo del acept-encoding, creo que me he columpiado, si no pones nada acepta el que manda el servidor.

Re: Mejorar scrapertools

Publicado: 09 Ene 2016, 17:16
por SeiTaN
A ver si alguno sabe, ¿¿porque se usa MozillaCookieJar en vez de LWPCookieJar?? Parece que es mejor usar LWP
https://docs.python.org/2/library/cooki ... b-browsers

He añadido un par de cosillas en la nueva versión, que como veis es bastante sencillo, en el caso de usar la gestión de cookies de requests no haría falta hacer mucho.

Si se quiere usar las de cookielib y que sea legible, se usa LWPCookieJar.

https://gist.github.com/SeiTaN80/2df49e574dd08886ef47

Re: Mejorar scrapertools

Publicado: 09 Ene 2016, 23:42
por robalo
No entiendo muy bien como pruebas LWPCookieJar, comprendo que el scrapertools esté todo como un poco remezclao y con code se repite que invita a simplificarlo. Básicamente creo que este hilo es más de función dowloadpage que del scrapertools. Personalmente sacaría todo lo relacionado con esta función y crearía un py requests para estas cosas y dejaba sólo en scrapertools las funciones que nos ahorren trabajo en el scraper.

Te voy a pegar una pequeña muestra que funciona bien en HDFull y W7 de lo que digo y de paso si te apetece y tienes tiempo intenta corregir el archivo de como se encajaría LWPCookieJar.

En HDFull tengo reemplazado todos los 'scrapertools.cache_page(' por 'requests.request_page(' y colocado 'from core import requests'. Evidentemente el code que te pego está guardado en core/requests.py :)

Código: Seleccionar todo

# -*- coding: utf-8 -*-

import os
import config
import urllib2
import cookielib
import StringIO
import gzip
import socket

DEBUG_LEVEL = True

def request_page( url, post=None, headers=[['User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0']], follow_redirects=True, timeout=socket.getdefaulttimeout(), get_headers=False, header_to_get=None ):

    urlopen = urllib2.urlopen
    Request = urllib2.Request

    ficherocookies = os.path.join( config.get_data_path(), 'cookies.dat' )

    cj = cookielib.MozillaCookieJar()
    cj.set_policy( MyCookiePolicy() )

    if os.path.isfile( ficherocookies ):
        try: cj.load( ficherocookies, ignore_discard=True )
        except: os.remove( ficherocookies )

    if not follow_redirects:
        opener = urllib2.build_opener( urllib2.HTTPHandler( debuglevel=DEBUG_LEVEL ), urllib2.HTTPCookieProcessor( cj ), NoRedirectHandler() )
    else:
        opener = urllib2.build_opener( urllib2.HTTPHandler( debuglevel=DEBUG_LEVEL ), urllib2.HTTPCookieProcessor( cj ) )

    urllib2.install_opener( opener )

    txheaders = dict( headers )

    req = Request( url, post, txheaders )

    try:
        if timeout is None: handle=urlopen( req )
        else:
            deftimeout = socket.getdefaulttimeout()
            socket.setdefaulttimeout( timeout )
            handle = urlopen( req )
            socket.setdefaulttimeout( deftimeout )

        cj.save( ficherocookies, ignore_discard=True )

        if handle.info().get('Content-Encoding') == 'gzip':
            data = handle.read()
            compressedstream = StringIO.StringIO( data )
            gzipper = gzip.GzipFile( fileobj=compressedstream )
            data = gzipper.read()
            gzipper.close()
        else: data = handle.read()
    except urllib2.HTTPError, e:
        data = e.read()
        return data

    info = handle.info()
    data1=""
    data2=""
    if get_headers:
        data1 = info
    if header_to_get is not None:
        data2 = None
        for header in info:
            if header == header_to_get.lower(): data2 = info[header]
    if data1 != "" and data2 != "":
       data = data, data1, data2
    elif data1 != "":
       data = data, data1
    elif data2 != "":
       data = data, data2

    handle.close()

    return data

class MyCookiePolicy(cookielib.DefaultCookiePolicy):
    def set_ok(self, cookie, request):
        return cookielib.DefaultCookiePolicy.set_ok(self, cookie, request)

    def return_ok(self, cookie, request):
        return cookielib.DefaultCookiePolicy.return_ok(self, cookie, request)

    def domain_return_ok(self, domain, request):
        return cookielib.DefaultCookiePolicy.domain_return_ok(self, domain, request)

    def path_return_ok(self,path, request):
        return cookielib.DefaultCookiePolicy.path_return_ok(self, path, request)

Re: Mejorar scrapertools

Publicado: 10 Ene 2016, 00:22
por SeiTaN
Me contesto a mi mismo, MozillaCookieJar se guarda de manera más simple y legible, por lo que voy a seguir usando la estructura actual, asi no se estropearía fichero cookies.dat
De momento me estoy pegando con las cookies que hace cosas raras :? , cuando lo tenga más o menos solucionado subo otra versión.

P.D: Acabo de ver tu mensaje robalo :oops:
MyCookiePolicy() según he visto no es necesario, ya que no define nada especial.

No solo será para downloadpage, tb añadire las cosas que nos hace más fácil las cosas como el htmlentities por ejemplo.

Saludos.

Re: Mejorar scrapertools

Publicado: 10 Ene 2016, 01:24
por robalo
A eso me refiero, dejar en scrapertools sólo ese tipo de cosas. Lo que he pegado es válido para sacar el body, headers o un header concreto. Si además le sobran líneas mejor :) también se le puede pasar al return data el reason y el número de error o lo que se le quiera, sólo hay que añadirlo en los argumentos si lo queremos o no y proceder de la misma forma que lo hace con los headers y header

Re: Mejorar scrapertools

Publicado: 10 Ene 2016, 12:35
por SeiTaN
Te he magreado un poco tu fichero, añadiendo una referencia a una clase que no estaba, libreria...

Código: Seleccionar todo

# -*- coding: utf-8 -*-

import os
import config
import urllib
import urllib2
import cookielib
import StringIO
import gzip
import socket

DEBUG_LEVEL = True


def request_page(url, post=None, headers=None, follow_redirects=True, timeout=socket.getdefaulttimeout(), 
                 get_headers=False, header_to_get=None):
    if headers is None:
        headers = [['User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0']]

    urlopen = urllib2.urlopen
    request = urllib2.Request

    ficherocookies = os.path.join(config.get_data_path(), 'cookies.dat')

    cj = cookielib.MozillaCookieJar()
    # cj.set_policy(MyCookiePolicy())

    if os.path.isfile(ficherocookies):
        try:
            cj.load(ficherocookies, ignore_discard=True)
        except cookielib.LoadError:
            os.remove(ficherocookies)

    if not follow_redirects:
        opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=DEBUG_LEVEL), urllib2.HTTPCookieProcessor(cj),
                                      NoRedirectHandler())
    else:
        opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=DEBUG_LEVEL), urllib2.HTTPCookieProcessor(cj))

    urllib2.install_opener(opener)

    txheaders = dict(headers)

    req = request(url, post, txheaders)

    try:
        if timeout is None:
            handle = urlopen(req)
        else:
            deftimeout = socket.getdefaulttimeout()
            socket.setdefaulttimeout(timeout)
            handle = urlopen(req)
            socket.setdefaulttimeout(deftimeout)

        cj.save(ficherocookies, ignore_discard=True)

        if handle.info().get('Content-Encoding') == 'gzip':
            data = handle.read()
            compressedstream = StringIO.StringIO(data)
            gzipper = gzip.GzipFile(fileobj=compressedstream)
            data = gzipper.read()
            gzipper.close()
        else:
            data = handle.read()
    except urllib2.HTTPError, e:
        data = e.read()
        return data

    info = handle.info()
    data1 = ""
    data2 = ""
    if get_headers:
        data1 = info
    if header_to_get is not None:
        data2 = None
        for header in info:
            if header == header_to_get.lower():
                data2 = info[header]
    if data1 != "" and data2 != "":
        data = data, data1, data2
    elif data1 != "":
        data = data, data1
    elif data2 != "":
        data = data, data2

    handle.close()

    return data


class NoRedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, headers):
        infourl = urllib.addinfourl(fp, headers, req.get_full_url())
        infourl.status = code
        infourl.code = code
        return infourl
    http_error_300 = http_error_302
    http_error_301 = http_error_302
    http_error_303 = http_error_302
    http_error_307 = http_error_302


# class MyCookiePolicy(cookielib.DefaultCookiePolicy):
#     def set_ok(self, cookie, request):
#         return cookielib.DefaultCookiePolicy.set_ok(self, cookie, request)
#
#     def return_ok(self, cookie, request):
#         return cookielib.DefaultCookiePolicy.return_ok(self, cookie, request)
#
#     def domain_return_ok(self, domain, request):
#         return cookielib.DefaultCookiePolicy.domain_return_ok(self, domain, request)
#
#     def path_return_ok(self,path, request):
#         return cookielib.DefaultCookiePolicy.path_return_ok(self, path, request)

Re: Mejorar scrapertools

Publicado: 11 Ene 2016, 01:01
por robalo
:) Gracias SeiTaN, ya la he incorporado y tambien he eliminado lo de Polyce. Como lo probé sin usar follow_redirects=True pues ni me enteré de que no lo había añadido, esta tarde me he dado cuenta intentando averiguar como hacer funcionar un canal italiano que algo se nos está escapando y que no damos con la tecla. Y ya que estamos y si queréis podéis echarles una mano, el reto es interesante al menos si os pasa como a mi que quizás esté omitiendo lo más obvio :)

El canal es este: https://github.com/Zanzibar82/streamond ... esubita.py

Re: Mejorar scrapertools

Publicado: 11 Ene 2016, 07:53
por SeiTaN
¿Que no te funciona exactamente?
"ya cuando arrivio a casa", lo prueba (no he podido evitar hacer """la gracia""" xDD)