Scrapy无法跟踪链接

2 投票
1 回答
4138 浏览
提问于 2025-04-16 23:30

我正在尝试从一个网站上抓取数据,但我发现 scrapy 这个工具无法跟踪链接。我没有收到任何 Python 错误提示,而且用 Wireshark 也看不到什么流量。我原以为可能是正则表达式的问题,所以我试了 ".*" 来尝试跟踪任何链接,但还是不行。不过,"parse" 这个方法是可以工作的,但我需要跟踪 "sinopsis.aspx" 并调用 parse_peliculas 方法。

补充一下:如果我把 parse 方法注释掉,规则就能正常工作了... parse_peliculas 方法会被执行。现在我需要做的是把 parse 方法改个名字,然后创建一个带回调的规则,但我还是没能让它正常工作。

这是我的爬虫代码:

import re

from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from Cinesillo.items import CinemarkItem, PeliculasItem

class CinemarkSpider(CrawlSpider):
    name = 'cinemark'
    allowed_domains = ['cinemark.com.mx']
    start_urls = ['http://www.cinemark.com.mx/smartphone/iphone/vercartelera.aspx?fecha=&id_theater=555',
                  'http://www.cinemark.com.mx/smartphone/iphone/vercartelera.aspx?fecha=&id_theater=528']


    rules = (Rule(SgmlLinkExtractor(allow=(r'sinopsis.aspx.*', )), callback='parse_peliculas', follow=True),)

    def parse(self, response):
        item = CinemarkItem()
        hxs = HtmlXPathSelector(response)
        cine = hxs.select('(//td[@class="title2"])[1]')
        direccion = hxs.select('(//td[@class="title2"])[2]')

        item['nombre'] = cine.select('text()').extract()
        item['direccion'] = direccion.select('text()').extract()
        return item

    def parse_peliculas(self, response):
        item = PeliculasItem()
        hxs = HtmlXPathSelector(response)
        titulo = hxs.select('//td[@class="pop_up_title"]')
        item['titulo'] = titulo.select('text()').extract()
        return item

谢谢

1 个回答

8

在编写爬虫规则时,尽量不要把parse作为回调函数,因为CrawlSpider本身就用parse方法来实现它的逻辑。所以如果你覆盖了parse方法,爬虫就会失效。

http://readthedocs.org/docs/scrapy/en/latest/topics/spiders.html

撰写回答