python - example - Scrapy Linkextractor duplicating(?)
scrapy python español (1)
Primero, para establecer la configuración, hágalo en el archivo settings.py
o puede especificar el parámetro custom_settings
en la araña, como:
custom_settings = {
''DEPTH_LIMIT'': 3,
}
Luego, debes asegurarte de que la araña está alcanzando el método parse_item
(que creo que no, aún no lo ha probado). Y tampoco puede especificar la callback
y follow
parámetros en una regla, porque no funcionan juntos.
Primero elimine el follow
de su regla, o agregue otra regla, para verificar qué enlaces seguir y qué enlaces regresar como elementos.
En segundo lugar en su método parse_item
, obtiene xpath incorrecto, para obtener todas las imágenes, tal vez podría usar algo como:
images=hxs.xpath(''//img'')
y luego para obtener la url de la imagen:
allimages[''image''] = image.xpath(''./@src'').extract()
para las noticias, parece que esto podría funcionar:
allnews[''news_title'']=new.xpath(''.//a/text()'').extract()
allnews[''news_url''] = new.xpath(''.//a/@href'').extract()
Ahora, y para comprender su problema, este no es un error de Linkextractor duplicating
, sino solo especificaciones de reglas deficientes, también asegúrese de tener un xpath válido , ya que su pregunta no indicó que necesitara la corrección de xpath.
Tengo el rastreador implementado como a continuación.
Está funcionando y pasará por sitios regulados por el link extractor
.
Básicamente, lo que intento hacer es extraer información de diferentes lugares de la página:
- href y text () en la clase ''noticias'' (si existe)
- url de la imagen debajo de la clase ''bloque de pensamiento'' (si existe)
Tengo tres problemas para mi terapia:
1) duplicando linkextractor
Parece que duplicará la página procesada. (Compruebo el archivo de exportación y descubrí que el mismo ~ .img apareció muchas veces, mientras que es casi imposible)
Y el hecho es que, para cada página del sitio web, hay hipervínculos en la parte inferior que facilitan a los usuarios dirigir al tema en el que están interesados, mientras que mi objetivo es extraer información de la página del tema (aquí se enumeran varios títulos de pasaje bajo mismo tema) y las imágenes que se encuentran en la página de un pasaje (puede llegar a la página del pasaje haciendo clic en el título del pasaje que se encuentra en la página del tema).
Sospecho que el extractor de enlaces volvería a repetir la misma página en este caso.
(tal vez resolver con depth_limit?)
2) Mejorando parse_item
Creo que no es bastante eficiente para parse_item
. ¿Cómo podría mejorarlo? Necesito extraer información de diferentes lugares en la web (para asegurarse de que solo se extrae si existe). Además, parece que el parse_item solo pudo progresar con HkejImage pero no con HkejItem (nuevamente lo comprobé con el archivo de salida). ¿Cómo debería abordar esto?
3) Necesito las arañas para poder leer chino.
Estoy rastreando un sitio en HK y sería esencial ser capaz de leer chino.
El sitio:
Siempre y cuando pertenezca a ''noticias diarias'', eso es lo que quiero.
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from scrapy.http import Request, FormRequest
from scrapy.contrib.linkextractors import LinkExtractor
import items
class EconjournalSpider(CrawlSpider):
name = "econJournal"
allowed_domains = ["hkej.com"]
login_page = ''http://www.hkej.com/template/registration/jsp/login.jsp''
start_urls = ''http://www.hkej.com/dailynews''
rules=(Rule(LinkExtractor(allow=(''dailynews'', ),unique=True), callback=''parse_item'', follow =True),
)
def start_requests(self):
yield Request(
url=self.login_page,
callback=self.login,
dont_filter=True
)
# name column
def login(self, response):
return FormRequest.from_response(response,
formdata={''name'': ''users'', ''password'': ''my password''},
callback=self.check_login_response)
def check_login_response(self, response):
"""Check the response returned by a login request to see if we are
successfully logged in.
"""
if "username" in response.body:
self.log("/n/n/nSuccessfully logged in. Let''s start crawling!/n/n/n")
return Request(url=self.start_urls)
else:
self.log("/n/n/nYou are not logged in./n/n/n")
# Something went wrong, we couldn''t log in, so nothing happens
def parse_item(self, response):
hxs = Selector(response)
news=hxs.xpath("//div[@class=''news'']")
images=hxs.xpath(''//p'')
for image in images:
allimages=items.HKejImage()
allimages[''image''] = image.xpath(''a/img[not(@data-original)]/@src'').extract()
yield allimages
for new in news:
allnews = items.HKejItem()
allnews[''news_title'']=new.xpath(''h2/@text()'').extract()
allnews[''news_url''] = new.xpath(''h2/@href'').extract()
yield allnews
¡Muchas gracias y apreciaría cualquier ayuda!