Scrapy 搔痒头痛-尝试调试。没有错误,但代码不工作

Scrapy 搔痒头痛-尝试调试。没有错误,但代码不工作,scrapy,web-crawler,Scrapy,Web Crawler,编辑:这已经解决了!XPATH是问题所在 我很困惑。我正试图写一个非常简单的蜘蛛,爬网一个网站(talkbas.com),让我在分类巴斯部分的所有链接列表(http://www.talkbass.com/forum/f126/ ). 我根据教程的内容编写了spider(我相对轻松地完成了该教程),但这一个不起作用。我可能做了很多错事,因为我也试图合并一个规则,但我什么也没有得到 我的商品代码是: from scrapy.item import Item, Field class BassItem

编辑:这已经解决了!XPATH是问题所在

我很困惑。我正试图写一个非常简单的蜘蛛,爬网一个网站(talkbas.com),让我在分类巴斯部分的所有链接列表(http://www.talkbass.com/forum/f126/ ). 我根据教程的内容编写了spider(我相对轻松地完成了该教程),但这一个不起作用。我可能做了很多错事,因为我也试图合并一个规则,但我什么也没有得到

我的商品代码是:

from scrapy.item import Item, Field
class BassItem(Item):
    title = Field()
    link = Field()
    print title, link
我的蜘蛛代码是:

from scrapy.spider import BaseSpider 
from scrapy.contrib.spiders import Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector
from tutorial.items import BassItem
class BassSpider(BaseSpider):
    name = "bass"
    allowed_domains = ["www.talkbass.com"]
    start_urls = ["http://www.talkbass.com/forum/f126/"]

    rules = (
        # Extract links matching 'f126/xxx'
        # and follow links from them (since no callback means follow=True by default).
        Rule(SgmlLinkExtractor(allow=('/f126/(\d*)/', ), ))
    )

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        ads = hxs.select('/html/body/div/div/div/table/tbody/tr/td/form/table/tbody')
        items = []
        for ad in ads:
            item = BassItem()
            item['title'] = ad.select('a/text()').extract()
            item['link'] = ad.select('a/@href').extract()
            items.append(item)
        return items
我没有收到任何错误,但是日志没有返回任何内容。以下是我在控制台中看到的内容:

C:\Python27\Scrapy\tutorial>scrapy crawl bass
2013-01-07 14:36:49+0800 [scrapy] INFO: Scrapy 0.16.3 started (bot: tutorial)
2013-01-07 14:36:49+0800 [scrapy] DEBUG: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, Co
reStats, SpiderState
{} {}
2013-01-07 14:36:51+0800 [scrapy] DEBUG: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddl
eware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, RedirectMiddleware, CookiesMiddleware, Htt
pCompressionMiddleware, ChunkedTransferMiddleware, DownloaderStats
2013-01-07 14:36:51+0800 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, Refe
rerMiddleware, UrlLengthMiddleware, DepthMiddleware
2013-01-07 14:36:51+0800 [scrapy] DEBUG: Enabled item pipelines:
2013-01-07 14:36:51+0800 [bass] INFO: Spider opened
2013-01-07 14:36:51+0800 [bass] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2013-01-07 14:36:51+0800 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2013-01-07 14:36:51+0800 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2013-01-07 14:36:52+0800 [bass] DEBUG: Crawled (200) <GET http://www.talkbass.com/forum/f126/> (referer: None)
2013-01-07 14:36:52+0800 [bass] INFO: Closing spider (finished)
2013-01-07 14:36:52+0800 [bass] INFO: Dumping Scrapy stats:
        {'downloader/request_bytes': 233,
         'downloader/request_count': 1,
         'downloader/request_method_count/GET': 1,
         'downloader/response_bytes': 17997,
         'downloader/response_count': 1,
         'downloader/response_status_count/200': 1,
         'finish_reason': 'finished',
         'finish_time': datetime.datetime(2013, 1, 7, 6, 36, 52, 305000),
         'log_count/DEBUG': 7,
         'log_count/INFO': 4,
         'response_received_count': 1,
         'scheduler/dequeued': 1,
         'scheduler/dequeued/memory': 1,
         'scheduler/enqueued': 1,
         'scheduler/enqueued/memory': 1,
         'start_time': datetime.datetime(2013, 1, 7, 6, 36, 51, 458000)}
2013-01-07 14:36:52+0800 [bass] INFO: Spider closed (finished)
但是,如果您看到“tr[6]”和“944468”—它们不是每个链接的常量(其他所有链接都是常量)。我刚刚删除了类名和编号,这些名称和编号留下了您在我的spider代码中看到的内容

另外,要添加—当我直接从XPath Helper复制和粘贴XPath时,它会给出一个语法错误:

    ads = hxs.select('/html/body/div[1]/div[@class='page']/div/table[5]/tbody/tr/td[2]/form[@id='inlinemodform']/table[@id='threadslist']/tbody[@id='threadbits_forum_126']/tr[6]/td[@id='td_threadtitle_944468']/div[1]/a[@id='thread_title_944468']')
                                                                                                                                                                                       ^
SyntaxError: invalid syntax

我尝试过混淆视听(使用通配符,其中元素不是常量),并且每次尝试时都会收到语法错误。可能导致问题的一个原因是您使用的BaseSpider没有实现规则

尝试将BaseSpider更改为爬行spider。您还应该将
parse
重命名为类似
parse\u item
(因为CrawlSpider实现了
parse
函数),这需要在规则中显式设置回调。例如:

rules = (
    # Extract links matching 'f126/xxx'
    # and follow links from them (since no callback means follow=True by default).
    Rule(SgmlLinkExtractor(allow=('index\d+\.html', )), callback='parse_item'),
)
要尝试的更新Xpath如下所示。请注意,这将包括所有粘性线程,因此这是留给OP的一个练习,以确定如何过滤掉这些线程

ads = hxs.select("//td[substring(@id, 1, 15) = 'td_threadtitle_']/div/a")

除了您试图在BaseSpider中使用不受支持的规则之外,您是否找到了与该hxs.select语句匹配的规则?尝试打开命令提示符,然后运行scrapy shell

然后类型

hxs.select('/html/body/div/div/div/table/tbody/tr/td/form/table/tbody') 
然后,

然后,

如果你真的找到了一个匹配项,那就简单一点

item = BassItem()
item['title'] = ad.select('/html/body/div/div/div/table/tbody/tr/td/form/table/tbody/a/text()').extract()
return item
然后在您的项目管道中

for i in item['title']:
    print i

底线是您的hxs.select语句不正确,因此在运行spider之前,您应该始终打开shell并测试您的hxs.select语句,直到您知道它们正确为止

您的代码中有几个问题

BaseSpider不支持规则

class BassSpider(BaseSpider):
因此,从爬行蜘蛛扩展您的爬虫程序,而不是BaseSpider它将开始爬行链接

class BassSpider(CrawlSpider):
抽汽部分

ads = hxs.select('/html/body/div/div/div/table/tbody/tr/td/form/table/tbody')
将Xpath转换为相对的,而不是绝对的


在大多数情况下,tbody标记在源代码上不存在,但浏览器在渲染时会显示此标记,因此包含tbody工作的Xapth在浏览器上但不在代码中。。。所以我建议您不要在xpath中使用tbody标记。

如前所述,xpath是这里的大问题。它已被编辑为“//table[@id=“threadslist”]/tbody/tr/td[@class=“alt1”][2]/div”

它已被更改。我的Xpath现在是“//table[@id=“threadslist”]/tbody/tr/td[@class=“alt1”][2]/div”,这很好用——我现在正在试验这个规则,因为我有一个URL的for循环,这不是一个通用的解决方案。我还尝试先使用相对XPath,但没有成功,我在第二个div中遇到了一个错误IIRC@jwl298大多数网站并没有tbody标记,但浏览器在呈现源代码时添加了这个标记,所以在这种情况下xpath主要在浏览器上工作,而不是在源代码中。。。这就是为什么我建议你不要使用tbody标记的原因。嘿,你能解释一下你是如何得到XPath的吗?最后我使用了以下命令:'//table[@id=“threadslist”]/tbody/tr/td[@class=“alt1”][2]/div'。它工作得很好,但我还没能让规则发挥作用-我复制了你的代码,改为爬行蜘蛛和解析_项(),但没有用…但这是一个单独的问题。只是想澄清一下,我还将实际的解析器改为解析_项,而不仅仅是像查克建议的规则代码,我运行了scrapy shell,检查了网站的源代码并尝试了不同的XPath。如果你对你拥有的感到满意,那就太好了。但是,如果您编辑问题以更新代码和当前面临的问题(即您的xpath有效,但您的规则无效),这将非常有用。虽然规则和xpath可能仍需要一些工作,但此代码无效的根本原因是规则和解析函数的缩进错误。不幸的是,scrapy不会抱怨或吐出任何运行时错误,但是使用旧的缩进,它不会按照规则跟随链接,也不会调用parse_item函数。好的,谢谢提示,我将把这个问题标记为已关闭,如果我真的无法使它工作,我将打开另一个线程。它已修复为'//table[@id'=“threadslist”]/tbody/tr/td[@class=“alt1”][2]/div”有效。但是,当我尝试像您一样执行相对路径时,它不起作用。我不知道为什么。
class BassSpider(BaseSpider):
class BassSpider(CrawlSpider):
ads = hxs.select('/html/body/div/div/div/table/tbody/tr/td/form/table/tbody')