Scrapy aranha erro índice
-
05-07-2019 - |
Pergunta
Este é o código para Spyder1 que eu tenho tentado a escrever no quadro Scrapy:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item
from firm.items import FirmItem
class Spider1(CrawlSpider):
domain_name = 'wc2'
start_urls = ['http://www.whitecase.com/Attorneys/List.aspx?LastName=A']
rules = (
Rule(SgmlLinkExtractor(allow=["hxs.select(
'//td[@class='altRow'][1]/a/@href').re('/.a\w+')"]),
callback='parse'),
)
def parse(self, response):
hxs = HtmlXPathSelector(response)
JD = FirmItem()
JD['school'] = hxs.select(
'//td[@class="mainColumnTDa"]').re('(?<=(JD,\s))(.*?)(\d+)'
)
return JD
SPIDER = Spider1()
O regex na rules
puxa com sucesso todas as urls do bio que eu quero do url início:
>>> hxs.select(
... '//td[@class="altRow"][1]/a/@href').re('/.a\w+')
[u'/cabel', u'/jacevedo', u'/jacuna', u'/aadler', u'/zahmedani', u'/tairisto', u
'/zalbert', u'/salberts', u'/aaleksandrova', u'/malhadeff', u'/nalivojvodic', u'
/kallchurch', u'/jalleyne', u'/lalonzo', u'/malthoff', u'/valvarez', u'/camon',
u'/randerson', u'/eandreeva', u'/pangeli', u'/jangland', u'/mantczak', u'/darany
i', u'/carhold', u'/marora', u'/garrington', u'/jartzinger', u'/sasayama', u'/ma
sschenfeldt', u'/dattanasio', u'/watterbury', u'/jaudrlicka', u'/caverch', u'/fa
yanruoh', u'/razar']
>>>
Mas quando eu executar o código I get
[wc2] ERROR: Error processing FirmItem(school=[]) -
[Failure instance: Traceback: <type 'exceptions.IndexError'>: list index out of range
Esta é a FirmItem em Items.py
from scrapy.item import Item, Field
class FirmItem(Item):
school = Field()
pass
Você pode me ajudar a entender onde o erro ocorre índice?
Parece-me que ele tem algo a ver com SgmLinkExtractor .
Eu tenho tentado para fazer este trabalho de aranha por semanas com Scrapy. Eles têm um excelente tutorial, mas eu sou novo para python e programação web, então eu não entendo como por exemplo SgmlLinkExtractor
trabalha por trás da cena.
Seria mais fácil para mim para tentar escrever uma aranha com a mesma funcionalidade simples com bibliotecas Python? Gostaria muito de receber quaisquer comentários e ajuda.
Graças
Solução
SgmlLinkExtractor não suporta seletores no seu argumento de "permitir".
Então, isso é errado:
SgmlLinkExtractor(allow=["hxs.select('//td[@class='altRow'] ...')"])
Esta é a direita:
SgmlLinkExtractor(allow=[r"product\.php"])
Outras dicas
A função de análise é chamado para cada jogo de sua SgmlLinkExtractor.
Como Pablo mencionado você quer simplificar a sua SgmlLinkExtractor.
Eu também tentei colocar os nomes raspados do url inicial em uma lista e, em seguida, passar cada nome para análise na forma de url absoluto como http://www.whitecase.com/aabbas
(para / aabbas).
O código a seguir circula sobre a lista, mas eu não sei como passar isso para analisar. Você acha que isso é uma idéia melhor?
baseurl = 'http://www.whitecase.com'
names = ['aabbas', '/cabel', '/jacevedo', '/jacuna', '/igbadegesin']
def makeurl(baseurl, names):
for x in names:
url = baseurl + x
baseurl = 'http://www.whitecase.com'
x = ''
return url