ScraPy 蜘蛛爬行但不导出

ScraPy spider crawling but not exporting

我在 shell 中有一个 运行 的 ScraPy 代码,但是当我尝试将它导出到 csv 时,它 returns 是一个空文件。当我不进入 link 并尝试解析描述时它会导出数据,但是一旦我添加了解析内容的额外方法,它就无法工作。这是代码:

class MonsterSpider(CrawlSpider):
    name = "monster"
    allowed_domains = ["jobs.monster.com"]
    base_url = "http://jobs.monster.com/v-technology.aspx?"
    start_urls = [
        "http://jobs.monster.com/v-technology.aspx"
    ]
    for i in range(1,5):
        start_urls.append(base_url + "page=" + str(i))

    rules = (Rule(SgmlLinkExtractor(allow=("jobs.monster.com",))
         , callback = 'parse_items'),)

    def parse_items(self, response):
        sel = Selector(response)
        sites = sel.xpath('//div[@class="col-xs-12"]')

        #items = []

        for site in sites.xpath('.//article[@class="js_result_row"]'):
            item = MonsterItem()
            item['title'] = site.xpath('.//span[@itemprop = "title"]/text()').extract()
            item['company'] = site.xpath('.//span[@itemprop = "name"]/text()').extract()
            item['city'] = site.xpath('.//span[@itemprop = "addressLocality"]/text()').extract()
            item['state'] = site.xpath('.//span[@itemprop = "addressRegion"]/text()').extract()
            item['link'] = site.xpath('.//a[@data-m_impr_a_placement_id= "jsr"]/@href').extract()
            follow = ''.join(item["link"])
            request = Request(follow, callback = self.parse_dir_contents)
            request.meta["item"] =  item
            yield request
            #items.append(item)
            #return items

    def parse_dir_contents(self, response):
        item = response.meta["item"]
        item['desc'] = site.xpath('.//div[@itemprop = "description"]/text()').extract()
        return item

取出 parse_dir_contents 并取消注释空的 "lists" 列表和 "append" 代码是原始代码。

您的 parse_dir_contents 方法有误:

def parse_dir_contents(self, response):
    item = response.meta["item"]
    item['desc'] = response.xpath('.//div[@itemprop=description"]/text()').extract()
    return item

注意 response 的用法。我不知道你从哪里得到你目前正在使用的 site

此外,当您 post 提出问题时,请尝试提供错误详细信息。写"it fails to work"没什么好说的

好吧,正如@tayfun 建议您应该使用 response.xpath 或定义 site 变量。

顺便说一句,您不需要使用sel = Selector(response)。响应自带 xpath 函数,无需覆盖到另一个选择器中。

但是主要问题是您限制了蜘蛛的域。您定义了 allowed_domains = ["jobs.monster.com"],但是如果您查看自定义 Request 的 URL 到 follow,您会发现它们类似于 http://jobview.monster.com/http://job-openings.monster.com.在这种情况下,您的 parse_dir_contents 不会被执行(该域是不允许的)并且您的 item 不会得到 returned,所以您不会得到任何结果。

allowed_domains = ["jobs.monster.com"]更改为

allowed_domains = ["monster.com"]

你会没事的,你的应用程序会运行 return 项。