example - scrapy spider
¿Cómo establecer diferentes ajustes de scrapy para diferentes arañas? (5)
Quiero habilitar algún http-proxy para algunas arañas, y desactivarlas para otras arañas.
¿Puedo hacer algo como esto?
# settings.py
proxy_spiders = [''a1'' , b2'']
if spider in proxy_spider: #how to get spider name ???
HTTP_PROXY = ''http://127.0.0.1:8123''
DOWNLOADER_MIDDLEWARES = {
''myproject.middlewares.RandomUserAgentMiddleware'': 400,
''myproject.middlewares.ProxyMiddleware'': 410,
''scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware'': None
}
else:
DOWNLOADER_MIDDLEWARES = {
''myproject.middlewares.RandomUserAgentMiddleware'': 400,
''scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware'': None
}
Si el código anterior no funciona, ¿hay alguna otra sugerencia?
¿Por qué no usar dos proyectos en lugar de solo uno?
Vamos a nombrar estos dos proyectos con proj1
y proj2
. En la settings.py
proj1
, ponga esta configuración:
HTTP_PROXY = ''http://127.0.0.1:8123''
DOWNLOADER_MIDDLEWARES = {
''myproject.middlewares.RandomUserAgentMiddleware'': 400,
''myproject.middlewares.ProxyMiddleware'': 410,
''scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware'': None
}
En proj2
de proj2
, ponga estas configuraciones:
DOWNLOADER_MIDDLEWARES = {
''myproject.middlewares.RandomUserAgentMiddleware'': 400,
''scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware'': None
}
Puede definir su propio middleware proxy, algo sencillo como este:
from scrapy.contrib.downloadermiddleware import HttpProxyMiddleware
class ConditionalProxyMiddleware(HttpProxyMiddleware):
def process_request(self, request, spider):
if getattr(spider, ''use_proxy'', None):
return super(ConditionalProxyMiddleware, self).process_request(request, spider)
Luego, defina el atributo use_proxy = True
en las arañas en las que desea tener habilitado el proxy. No olvides deshabilitar el middleware de proxy predeterminado y habilitar el tuyo modificado.
un poco tarde, pero desde la versión 1.0.0 hay una nueva función en scrapy donde puedes anular la configuración por araña como esta:
class MySpider(scrapy.Spider):
name = "my_spider"
custom_settings = {"HTTP_PROXY":''http://127.0.0.1:8123'',
"DOWNLOADER_MIDDLEWARES": {''myproject.middlewares.RandomUserAgentMiddleware'': 400,
''myproject.middlewares.ProxyMiddleware'': 410,
''scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware'': None}}
class MySpider2(scrapy.Spider):
name = "my_spider2"
custom_settings = {"DOWNLOADER_MIDDLEWARES": {''myproject.middlewares.RandomUserAgentMiddleware'': 400,
''scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware'': None}}
Puede agregar setting.overrides dentro del archivo spider.py Ejemplo que funciona:
from scrapy.conf import settings
settings.overrides[''DOWNLOAD_TIMEOUT''] = 300
Para ti, algo como esto también debería funcionar
from scrapy.conf import settings
settings.overrides[''DOWNLOADER_MIDDLEWARES''] = {
''myproject.middlewares.RandomUserAgentMiddleware'': 400,
''scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware'': None
}
Hay una forma nueva y más fácil de hacer esto.
class MySpider(scrapy.Spider):
name = ''myspider''
custom_settings = {
''SOME_SETTING'': ''some value'',
}
Yo uso Scrapy 1.3.1