Advertisement
Guest User

Untitled

a guest
Sep 17th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.33 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. import scrapy
  4. import psycopg2 #Para establecer conexion con la base de datos.
  5.  
  6. from scrapy.spiders import CrawlSpider, Rule #Para la creacion del bot y sus reglas de busqueda
  7. from scrapy.linkextractors import LinkExtractor #Para extraer link de las paginas visitadas
  8. import time
  9. #---------------------------------------------------------------------------------------------------------------------------------
  10.  
  11.  
  12. # #Creando la conexion.
  13. conn = psycopg2.connect(database="namedb", user="postgres", password="root", host="127.0.0.1", port="5432")
  14. # #Creando cursor.
  15. cur = conn.cursor()
  16.  
  17.  
  18. #---------------------------------------------------------------------------------------------------------------------------------
  19. #Funciones
  20.  
  21.  
  22. def leer_datos(nombre_archivo):
  23. """Lee un archivo txt y devuelve un array donde cada posicion es una fila del archivo.
  24. Argumentos:
  25. nombre_archivo: String. No debe tener la extension.
  26. """
  27.  
  28. array = []
  29. archivo = open(nombre_archivo + '.txt','r')
  30. linea = archivo.readline()
  31. while linea != '':
  32. # Lee el archivo por lineas y las agrega al array.
  33.  
  34. cadena = linea.strip('n') #Saca el valor 'n' de la linea
  35. array.append(cadena) #Agrega la linea al array
  36. linea = archivo.readline()
  37. archivo.close() # Cierra archivo
  38. return array
  39.  
  40.  
  41. def insertar_datos(nombre_archivo,cadena):
  42. """Inserta un string en una fila de un archivo txt.
  43. Argumentos:
  44. nombre_archivo: String. No debe tener la extension.
  45. cadena: String a escribir en el archivo.
  46. """
  47.  
  48. archivo = open(nombre_archivo + '.txt', "r+")
  49. contenido = archivo.read() #Lee todo el contenido y el cursor queda al final.
  50. final_de_archivo = archivo.tell() #Obtiene la posicion del cursor. Se encuentra en el final (ver linea anterior).
  51. archivo.seek(final_de_archivo) #El cursor queda al final del archivo y se evita que vuelva al inicio al escribir.
  52. archivo.write(cadena)
  53. archivo.write('n')
  54. archivo.close()
  55.  
  56.  
  57. #---------------------------------------------------------------------------------------------------------------------------------
  58. #Clases
  59.  
  60. #Clase para la extracion de elementos.
  61.  
  62.  
  63.  
  64. class LiderItem(scrapy.Item):
  65.  
  66. name_prod = scrapy.Field()
  67. pricing = scrapy.Field()
  68. category = scrapy.Field()
  69. description = scrapy.Field()
  70. supermarket = scrapy.Field()
  71. url = scrapy.Field()
  72.  
  73.  
  74. #Clase principal del programa.
  75. class LiderSpider(CrawlSpider):
  76.  
  77. #Configuracion inicial
  78. custom_settings = {
  79. "CLOSESPIDER_ITEMCOUNT":25, #Cantidad de elementos a buscar. Comienza a contar desde el 0.
  80. "CONCURRENT_REQUESTS":1, #Cantidad de url que puede visitar a la vez.
  81. "CONCURRENT_ITEMS":1, #Cantidad de elementos que puede visitar a la vez.
  82. }
  83. name = 'Lider' #Nombre del bot
  84. allowed_domain = ['www.lider.cl'] #Dominios permitidos para las url que puede visitar.
  85.  
  86.  
  87. start_urls = ['https://www.lider.cl/supermercado/category/Despensa/Pastas-y-Salsas/_/N-pgxorj']
  88.  
  89. #Leyendo el archivo "visitados.txt". En caso de no existir se crea.
  90. file = open("Lider_visitados.txt", "a+")
  91. datos_visitados = file.read()
  92. file.close()
  93.  
  94. #Obteniendo las url visitadas.
  95. if datos_visitados == '':
  96. url_visitadas = None
  97. else:
  98. url_visitadas = []
  99. url_visitadas = leer_datos("Lider_visitados") #Se reciben las url visitadas desde el archivo visitados.txt
  100.  
  101. #Reglas para la extraccion de url.
  102. rules = (
  103.  
  104. #deny no permite que visite las url que ya ha procesado. restrict_xpaths le restringe moverse horizontalmente solo por las siguentes paginas.
  105. Rule(LinkExtractor(deny = (url_visitadas), restrict_xpaths = ( '//*[@id="paginationBox"]/nav/ul[2]/li[6]/a'))),
  106.  
  107. #restrict_xpaths le restringe moverse verticalmente solo por los item de la pagina actual.
  108. Rule(LinkExtractor( deny = (url_visitadas), restrict_xpaths = ('//*[starts-with(@class,"product-link")]')),
  109.  
  110. #Una vez que consigue las url llama mediante callback a la funcion 'parse_item' para procesar y extraer los datos.
  111. callback = 'parse_item', follow = False)
  112. )
  113.  
  114.  
  115. def parse_item(self, response):
  116. """Recibe una pagina y extrae los datos para luego guardarlos en la base de datos."""
  117.  
  118. item = LiderItem()
  119.  
  120. #Extrayendo informacion.
  121. direccion_url = response.url
  122. item['name_prod'] = response.xpath('normalize-space(//span[@class="product-descript"]/text())').extract_first()
  123. item['pricing'] = response.xpath('normalize-space(//p[@class="price"])').extract_first()
  124. item['category'] = 'salsas'
  125. item['description'] = 'ninguna'
  126. item['supermarket'] = 'lider'
  127. item['url'] = direccion_url.encode("utf-8")
  128.  
  129.  
  130.  
  131. print("n >>>> EL NOMBRE ES: {0} n LA URL ES: {1} nn".format(item['name_prod'].encode("utf-8"), item['url'].encode("utf-8")))
  132. time.sleep(5)
  133.  
  134. #Preparando sentencia para ingresar datos en base de datos.
  135. valores = "INSERT INTO products(nombre,precio,categoria,descripcion,supermercado,url) VALUES (%s,%s,%s,%s,%s,%s);"
  136. data = (item['name_prod'],item['pricing'],item['category'],item['description'],item['supermarket'],item['url'])
  137.  
  138.  
  139. try:
  140. #Insertando datos en base de datos.
  141. cur.execute(valores,data)
  142. conn.commit()
  143.  
  144. #Registrando la url procesada en archivo de url visitadas.
  145. insertar_datos("Lider_visitados",direccion_url)
  146.  
  147. print("Datos insertados correctamente.n")
  148. except:
  149. print("NO se han insertado.")
  150. print("---------------------")
  151. yield item
  152.  
  153. CREATE TABLE products(
  154. product_id SERIAL,
  155. nombre VARCHAR(40),
  156. precio VARCHAR(10),
  157. categoria VARCHAR(20),
  158. descripcion VARCHAR(200),
  159. supermercado VARCHAR(20),
  160. url VARCHAR(200),
  161.  
  162. PRIMARY KEY(product_id)
  163. );
  164.  
  165. https://www.lider.cl/supermercado/product/Carozzi-Pasta-Vitaminizada-Fetuccine-88-Bolsa/299553
  166. https://www.lider.cl/supermercado/product/Carozzi-Fideos-Fusilli-Tricolor-Bolsa/268340
  167. https://www.lider.cl/supermercado/product/Carozzi-Spaghetti-Integral-Vitaminizado-Bolsa/338525
  168.  
  169. C:UsersEmilioDesktopU8VO SEMESTREIngeniería de Software IIProyectoScrape
  170. o>scrapy runspider lider2.py
  171. 2018-09-17 14:40:59 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: scrapybo
  172. t)
  173. 2018-09-17 14:40:59 [scrapy.utils.log] INFO: Versions: lxml 4.2.1.0, libxml2 2.9
  174. .5, cssselect 1.0.3, parsel 1.4.0, w3lib 1.19.0, Twisted 17.5.0, Python 2.7.14 |
  175. Anaconda, Inc.| (default, Mar 27 2018, 12:30:54) [MSC v.1500 64 bit (AMD64)], py
  176. OpenSSL 17.5.0 (OpenSSL 1.0.2o 27 Mar 2018), cryptography 2.2.2, Platform Windo
  177. ws-7-6.1.7601-SP1
  178. 2018-09-17 14:40:59 [scrapy.crawler] INFO: Overridden settings: {'SPIDER_LOADER_
  179. WARN_ONLY': True, 'CLOSESPIDER_ITEMCOUNT': 25, 'CONCURRENT_ITEMS': 1, 'CONCURREN
  180. T_REQUESTS': 1}
  181. 2018-09-17 14:40:59 [scrapy.middleware] INFO: Enabled extensions:
  182. ['scrapy.extensions.closespider.CloseSpider',
  183. 'scrapy.extensions.logstats.LogStats',
  184. 'scrapy.extensions.telnet.TelnetConsole',
  185. 'scrapy.extensions.corestats.CoreStats']
  186. 2018-09-17 14:41:00 [scrapy.middleware] INFO: Enabled downloader middlewares:
  187. ['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
  188. 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
  189. 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
  190. 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
  191. 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
  192. 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
  193. 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
  194. 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
  195. 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
  196. 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
  197. 'scrapy.downloadermiddlewares.stats.DownloaderStats']
  198. 2018-09-17 14:41:00 [scrapy.middleware] INFO: Enabled spider middlewares:
  199. ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
  200. 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
  201. 'scrapy.spidermiddlewares.referer.RefererMiddleware',
  202. 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
  203. 'scrapy.spidermiddlewares.depth.DepthMiddleware']
  204. 2018-09-17 14:41:00 [scrapy.middleware] INFO: Enabled item pipelines:
  205. []
  206. 2018-09-17 14:41:00 [scrapy.core.engine] INFO: Spider opened
  207. 2018-09-17 14:41:00 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pag
  208. es/min), scraped 0 items (at 0 items/min)
  209. 2018-09-17 14:41:00 [scrapy.extensions.telnet] DEBUG: Telnet console listening o
  210. n 127.0.0.1:6023
  211. 2018-09-17 14:41:04 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.l
  212. ider.cl/supermercado/category/Despensa/Pastas-y-Salsas/_/N-pgxorj> (referer: Non
  213. e)
  214. 2018-09-17 14:41:04 [scrapy.dupefilters] DEBUG: Filtered duplicate request: <GET
  215. https://www.lider.cl/supermercado/product/Malloa-Salsa-de-Tomates-Italiana/3369
  216. > - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicate
  217. s)
  218. 2018-09-17 14:41:07 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.l
  219. ider.cl/supermercado/category/Despensa/Pastas-y-Salsas/_/N-pgxorj?No=40&isNavReq
  220. uest=Yes&Nrpp=40&page=2> (referer: https://www.lider.cl/supermercado/category/De
  221. spensa/Pastas-y-Salsas/_/N-pgxorj)
  222. 2018-09-17 14:41:09 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.l
  223. ider.cl/supermercado/product/Carozzi-Pasta-Vitaminizada-Fetuccine-88-Bolsa/29955
  224. 3> (referer: https://www.lider.cl/supermercado/category/Despensa/Pastas-y-Salsas
  225. /_/N-pgxorj)
  226. Datos insertados correctamente.
  227.  
  228. 2018-09-17 14:41:14 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.l
  229. ider.cl/supermercado/product/Carozzi-Pasta-Vitaminizada-Fetuccine-88-Bolsa/29955
  230. 3>
  231. {'category': 'salsas',
  232. 'description': 'ninguna',
  233. 'name_prod': 'Pasta Vitaminizada Fetuccine 88 Bolsa',
  234. 'pricing': u'$690',
  235. 'supermarket': 'lider',
  236. 'url': 'https://www.lider.cl/supermercado/product/Carozzi-Pasta-Vitaminizada-Fe
  237. tuccine-88-Bolsa/299553'}
  238. 2018-09-17 14:41:14 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.l
  239. ider.cl/supermercado/product/Carozzi-Fideos-Fusilli-Tricolor-Bolsa/268340> (refe
  240. rer: https://www.lider.cl/supermercado/category/Despensa/Pastas-y-Salsas/_/N-pgx
  241. orj?No=40&isNavRequest=Yes&Nrpp=40&page=2)
  242. Datos insertados correctamente.
  243.  
  244. 2018-09-17 14:41:19 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.l
  245. ider.cl/supermercado/product/Carozzi-Fideos-Fusilli-Tricolor-Bolsa/268340>
  246. {'category': 'salsas',
  247. 'description': 'ninguna',
  248. 'name_prod': 'Fideos Fusilli Tricolor Bolsa',
  249. 'pricing': u'$590',
  250. 'supermarket': 'lider',
  251. 'url': 'https://www.lider.cl/supermercado/product/Carozzi-Fideos-Fusilli-Tricol
  252. or-Bolsa/268340'}
  253. 2018-09-17 14:41:19 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.l
  254. ider.cl/supermercado/product/Carozzi-Spaghetti-Integral-Vitaminizado-Bolsa/33852
  255. 5> (referer: https://www.lider.cl/supermercado/category/Despensa/Pastas-y-Salsas
  256. /_/N-pgxorj?No=40&isNavRequest=Yes&Nrpp=40&page=2)
  257. Datos insertados correctamente.
  258.  
  259. 2018-09-17 14:41:24 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.l
  260. ider.cl/supermercado/product/Carozzi-Spaghetti-Integral-Vitaminizado-Bolsa/33852
  261. 5>
  262. {'category': 'salsas',
  263. 'description': 'ninguna',
  264. 'name_prod': 'Spaghetti Integral Vitaminizado Bolsa',
  265. 'pricing': u'$590',
  266. 'supermarket': 'lider',
  267. 'url': 'https://www.lider.cl/supermercado/product/Carozzi-Spaghetti-Integral-Vi
  268. taminizado-Bolsa/338525'}
  269. 2018-09-17 14:41:24 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.l
  270. ider.cl/supermercado/product/Maggi-Salsa-de-Tomates-Tuco-con-Champi%C3%B1ones-Ta
  271. rro/813804> (referer: https://www.lider.cl/supermercado/category/Despensa/Pastas
  272. -y-Salsas/_/N-pgxorj?No=40&isNavRequest=Yes&Nrpp=40&page=2)
  273. NO se han insertado.
  274. ---------------------
  275. 2018-09-17 14:41:29 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.l
  276. ider.cl/supermercado/product/Maggi-Salsa-de-Tomates-Tuco-con-Champi%C3%B1ones-Ta
  277. rro/813804>
  278. {'category': 'salsas',
  279. 'description': 'ninguna',
  280. 'name_prod': 'Salsa de Tomates Tuco con Champixc3xb1ones Tarro',
  281. 'pricing': u'$950',
  282. 'supermarket': 'lider',
  283. 'url': 'https://www.lider.cl/supermercado/product/Maggi-Salsa-de-Tomates-Tuco-c
  284. on-Champi%C3%B1ones-Tarro/813804'}
  285. 2018-09-17 14:41:29 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.l
  286. ider.cl/supermercado/product/Pomarola-Salsa-de-Tomates-Casera-con-Cubitos-de-Tom
  287. ates-Doypack/371659> (referer: https://www.lider.cl/supermercado/category/Despen
  288. sa/Pastas-y-Salsas/_/N-pgxorj?No=40&isNavRequest=Yes&Nrpp=40&page=2)
  289. NO se han insertado.
  290. ---------------------
  291. 2018-09-17 14:41:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.l
  292. ider.cl/supermercado/product/Pomarola-Salsa-de-Tomates-Casera-con-Cubitos-de-Tom
  293. ates-Doypack/371659>
  294. {'category': 'salsas',
  295. 'description': 'ninguna',
  296. 'name_prod': 'Salsa de Tomates Casera con Cubitos de Tomates Doypack',
  297. 'pricing': u'$470',
  298. 'supermarket': 'lider',
  299. 'url': 'https://www.lider.cl/supermercado/product/Pomarola-Salsa-de-Tomates-Cas
  300. era-con-Cubitos-de-Tomates-Doypack/371659'}
  301. 2018-09-17 14:41:35 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.l
  302. ider.cl/supermercado/product/Trattoria-Fideos-Fusilli-Bolsa/270370> (referer: ht
  303. tps://www.lider.cl/supermercado/category/Despensa/Pastas-y-Salsas/_/N-pgxorj?No=
  304. 40&isNavRequest=Yes&Nrpp=40&page=2)
  305. 2018-09-17 14:41:35 [scrapy.crawler] INFO: Received SIGINT, shutting down gracef
  306. ully. Send again to force
  307. 2018-09-17 14:41:35 [scrapy.core.scraper] ERROR: Spider error processing <GET ht
  308. tps://www.lider.cl/supermercado/product/Trattoria-Fideos-Fusilli-Bolsa/270370> (
  309. referer: https://www.lider.cl/supermercado/category/Despensa/Pastas-y-Salsas/_/N
  310. -pgxorj?No=40&isNavRequest=Yes&Nrpp=40&page=2)
  311. Traceback (most recent call last):
  312. File "C:ProgramDataMiniconda2libsite-packagesscrapyutilsdefer.py", line
  313. 102, in iter_errback
  314. yield next(it)
  315. File "C:ProgramDataMiniconda2libsite-packagesscrapyspidermiddlewaresoff
  316. site.py", line 30, in process_spider_output
  317. for x in result:
  318. File "C:ProgramDataMiniconda2libsite-packagesscrapyspidermiddlewaresref
  319. erer.py", line 339, in <genexpr>
  320. return (_set_referer(r) for r in result or ())
  321. File "C:ProgramDataMiniconda2libsite-packagesscrapyspidermiddlewaresurl
  322. length.py", line 37, in <genexpr>
  323. return (r for r in result or () if _filter(r))
  324. File "C:ProgramDataMiniconda2libsite-packagesscrapyspidermiddlewaresdep
  325. th.py", line 58, in <genexpr>
  326. return (r for r in result or () if _filter(r))
  327. File "C:ProgramDataMiniconda2libsite-packagesscrapyspiderscrawl.py", li
  328. ne 78, in _parse_response
  329. for requests_or_item in iterate_spider_output(cb_res):
  330. File "C:UsersEmilioDesktopU8VO SEMESTREIngenierÝa de Software IIProyect
  331. oScrapeolider2.py", line 156, in parse_item
  332. time.sleep(5)
  333. IOError: [Errno 4] Interrupted function call
  334. 2018-09-17 14:41:35 [scrapy.core.engine] INFO: Closing spider (shutdown)
  335. 2018-09-17 14:41:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.l
  336. ider.cl/supermercado/product/Lucchetti-Fideos-Cabellitos-Bolsa/296761> (referer:
  337. https://www.lider.cl/supermercado/category/Despensa/Pastas-y-Salsas/_/N-pgxorj?
  338. No=40&isNavRequest=Yes&Nrpp=40&page=2)
  339. NO se han insertado.
  340. ---------------------
  341. 2018-09-17 14:41:41 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.l
  342. ider.cl/supermercado/product/Lucchetti-Fideos-Cabellitos-Bolsa/296761>
  343. {'category': 'salsas',
  344. 'description': 'ninguna',
  345. 'name_prod': 'Fideos Cabellitos Bolsa',
  346. 'pricing': u'$660',
  347. 'supermarket': 'lider',
  348. 'url': 'https://www.lider.cl/supermercado/product/Lucchetti-Fideos-Cabellitos-B
  349. olsa/296761'}
  350. 2018-09-17 14:41:41 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
  351. {'downloader/request_bytes': 4542,
  352. 'downloader/request_count': 9,
  353. 'downloader/request_method_count/GET': 9,
  354. 'downloader/response_bytes': 612918,
  355. 'downloader/response_count': 9,
  356. 'downloader/response_status_count/200': 9,
  357. 'dupefilter/filtered': 80,
  358. 'finish_reason': 'shutdown',
  359. 'finish_time': datetime.datetime(2018, 9, 17, 17, 41, 41, 696000),
  360. 'item_scraped_count': 6,
  361. 'log_count/DEBUG': 17,
  362. 'log_count/ERROR': 1,
  363. 'log_count/INFO': 8,
  364. 'request_depth_max': 2,
  365. 'response_received_count': 9,
  366. 'scheduler/dequeued': 9,
  367. 'scheduler/dequeued/memory': 9,
  368. 'scheduler/enqueued': 83,
  369. 'scheduler/enqueued/memory': 83,
  370. 'spider_exceptions/IOError': 1,
  371. 'start_time': datetime.datetime(2018, 9, 17, 17, 41, 0, 969000)}
  372. 2018-09-17 14:41:41 [scrapy.core.engine] INFO: Spider closed (shutdown)
  373.  
  374. C:UsersEmilioDesktopU8VO SEMESTREIngeniería de Software IIProyectoScrape
  375. o>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement