【问题标题】:Scrapy works in shell but not when I call my spiderScrapy 在 shell 中工作,但当我打电话给我的蜘蛛时却不行
【发布时间】:2014-02-19 20:55:21
【问题描述】:

过去几个小时我一直在研究这个问题,但无法弄清楚我做错了什么。当我使用 scrapy shell 中的选择器运行我的 xpath 状态时,该语句按预期工作。然而,当我尝试在我的蜘蛛中使用相同的语句时,我得到一个空集。有谁知道我做错了什么?

from scrapy.spider import Spider
from scrapy.selector import Selector
from TFFRS.items import Result

class AthleteSpider(Spider):
        name = "athspider"
        allowed_domains = ["www.tffrs.org"]
        start_urls = ["http://www.tffrs.org/athletes/3237431/",]

        def parse(self, response):
            sel = Selector(response)
            results = sel.xpath("//table[@id='results_data']/tr")
            items = []
            for r in results:
                item = Result()
                item['event'] = r.xpath("td[@class='event']").extract()
                items.append(item)
            return items

【问题讨论】:

  • 没有任何 HTML,很难说。您指定的 URL 几乎只包含 javascript,并且没有带有您要查找的 id 的标签。你是如何用 HTML 填充你的 scrapy shell 的?
  • 你确定这个 start_url 吗?它说域名正在出售
  • 我刚刚检查过了,是的,这只是广告。那里根本没有“results_data”。

标签: xpath web-crawler scrapy


【解决方案1】:

当蜘蛛查看您的网址时,您的网址不包含任何内容。要调试此类问题,您应该在解析方法中使用scrapy.shell.inspect_response,这样使用它:

from scrapy.shell import inspect_response

class AthleteSpider(Spider):

    # all your code    
    def parse(self, response):
        inspect_response(response, self)

那么当你这样做时

scrapy crawl <your spider>

你会从你的蜘蛛体内得到一个外壳。你应该这样做:

In [1]: view(response)

这将在查找此特定蜘蛛时显示此特定响应。

【讨论】:

    【解决方案2】:

    尝试使用 HtmlXPathSelector 来提取 xpath。 从start_urls 部分中删除http。此外,表 id 是您在 xpath 中未正确输入的内容。尝试使用检查元素为要抓取的数据获取正确的 xpath。

    还可以考虑更改函数名称,来自文档:

    警告

    在编写爬虫规则时,避免使用 parse 作为回调,因为 CrawlSpider 使用 parse 方法本身来实现其逻辑。 所以如果你重写 parse 方法,爬虫将不再 工作

    【讨论】:

    • 这与他的问题有什么关系?据我所知,他没有使用 CrawlSpider
    【解决方案3】:

    Scrapy 蜘蛛必须实现特定的方法;例如:parsestart_requestsdocs 中还有其他人
    所以如果你不为此实现这些方法,你就会遇到问题。在我的情况下,问题是我有一个错字,我的函数名称是 start_request 而不是 start_requests
    所以确保你的骨架是这样的:

    class MySpider(scrapy.Spider):
        name = "name"
        allowed_domains = ["https://example.com"]
        start_urls = ['https://example.com/']
    
        def start_requests(self):
            #start_request method
    
        def parse(self, response):
            #parse method
    

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多