我正在尝试使用Scrapy构建一个webcrawler蜘蛛,我已经为我希望我的抓取工具使用正则表达式获取的链接设置了规则:
rules = (Rule(SgmlLinkExtractor(allow='http\:\/\/www\.cartelera\.com\.uy\/apeliculafunciones\.aspx\?[^"]*1&29'), 'parse_loly', follow=True, ),)
我检查了正则表达式并且它有效并且它匹配我希望蜘蛛爬行的链接,但是当我运行程序时,蜘蛛没有发现任何项目并且稍微检查我发现正则表达式正确匹配项目当蜘蛛去爬页时,它使用的网址与应该的网页不同。
例如,蜘蛛应匹配并抓取网址,例如
http://www.cartelera.com.uy/apeliculafunciones.aspx?7242&&CINE&OBRA&-1&29
http://www.cartelera.com.uy/apeliculafunciones.aspx?10704&&CINE&OBRA&-1&29
http://www.cartelera.com.uy/apeliculafunciones.aspx?10697&&CINE&OBRA&-1&29
但网址scrapy爬行就像
一样http://www.cartelera.com.uy/apeliculafunciones.aspx?-1=&29=&7242=&CINE=&OBRA=
http://www.cartelera.com.uy/apeliculafunciones.aspx?-1=&29=&10704=&CINE=&OBRA=
http://www.cartelera.com.uy/apeliculafunciones.aspx?-1=&29=&10697=&CINE=&OBRA=
这些网址导致错误页面显然没有找到任何项目。
没有错误消息 为什么会发生这种情况,我该如何避免呢?
将我的课程代码粘贴在
下面class MySpider(CrawlSpider):
name = 'cartelera'
allowed_domains = ["www.cartelera.com.uy"]
start_urls = ["http://www2.cartelera.com.uy/apeliculafunciones.aspx?,,PELICULAS,OBRA,0,26"]
rules = (Rule(SgmlLinkExtractor(allow='http\:\/\/www\.cartelera\.com\.uy\/apeliculafunciones\.aspx\?[^"]*1&29'), 'parse_loly', follow=True, ),)
##simple debugging method to output and check the crawled urls
def parse_loly(self, response):
print '%s' % response.url
return
答案 0 :(得分:3)
那些网址不是标准的,你可以通过告诉sgml提取器不要规范化它们来克服这个问题,例如:
SgmlLinkExtractor(allow='http...', canonicalize=False)
这是你如何使用scrapy shell找到它:
$ scrapy shell "http://www2.cartelera.com.uy/apeliculafunciones.aspx?,,PELICULAS,OBRA,0,26"
...
>>> from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
>>> s = SgmlLinkExtractor(allow='http\:\/\/www\.cartelera\.com\.uy\/apeliculafunciones\.aspx\?[^"]*1&29', canonicalize=False)
>>> for link in s.extract_links(response):
... print link
...
Link(url='http://www.cartelera.com.uy/apeliculafunciones.aspx?10697&&CINE&OBRA&-1&29', text=u'', fragment='', nofollow=False)
Link(url='http://www.cartelera.com.uy/apeliculafunciones.aspx?10697&&CINE&OBRA&-1&29#titulosalas', text=u'aqu\xed', fragment='', nofollow=False)
Link(url='http://www.cartelera.com.uy/apeliculafunciones.aspx?10795&&CINE&OBRA&-1&29', text=u'', fragment='', nofollow=False)
...