Scrapy爬虫索引错误
这是我在Scrapy框架中尝试编写的Spyder1的代码:
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()
在rules
中的正则表达式成功地从起始网址中提取了我想要的所有个人资料链接:
>>> 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']
>>>
但是当我运行代码时,我遇到了
[wc2] ERROR: Error processing FirmItem(school=[]) -
[Failure instance: Traceback: <type 'exceptions.IndexError'>: list index out of range
这是Items.py中的FirmItem
from scrapy.item import Item, Field
class FirmItem(Item):
school = Field()
pass
你能帮我理解一下索引错误是在哪里发生的吗?
我觉得这可能和SgmLinkExtractor有关。
我已经尝试了几周让这个爬虫在Scrapy中正常工作。他们有一个很棒的教程,但我对Python和网页编程还是很陌生,所以我不太明白比如说SgmlLinkExtractor
是如何工作的。
我是不是可以尝试用Python库写一个功能简单的爬虫,这样会更容易一些?我会很感激任何评论和帮助。
谢谢
3 个回答
0
每当你的 SgmlLinkExtractor 找到一个匹配项时,就会调用 parse 函数。
正如 Pablo 所提到的,你需要简化你的 SgmlLinkExtractor。
0
我也试着把从最初的网址抓取到的名字放到一个列表里,然后把每个名字以绝对网址的形式传给解析,比如 http://www.whitecase.com/aabbas
(这里的 /aabbas 是名字的一部分)。
下面的代码会循环这个列表,但我不知道怎么把这个传给解析。你觉得这样做更好吗?
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
1
SgmlLinkExtractor不支持在它的“allow”参数中使用选择器。
所以这样写是错误的:
SgmlLinkExtractor(allow=["hxs.select('//td[@class='altRow'] ...')"])
而这样写是正确的:
SgmlLinkExtractor(allow=[r"product\.php"])